diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-03-30 16:46:07 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-03-30 16:46:07 +0000 |
commit | 1ab7cc3a1064ab070ba4c68be45025469e8ce0e4 (patch) | |
tree | 395a7c9a0fabf67a44dae9f6c7ad0eaab5f29241 /pjsip | |
parent | f6a5c213e195032aa9aa7367e81737b8bde8437f (diff) |
Fixed crash bug with poll_reset() in rdata
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@367 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r-- | pjsip/src/pjsip/sip_transport.c | 2 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_transport_udp.c | 26 |
2 files changed, 21 insertions, 7 deletions
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c index 2caa7cb2..6468d912 100644 --- a/pjsip/src/pjsip/sip_transport.c +++ b/pjsip/src/pjsip/sip_transport.c @@ -431,8 +431,8 @@ static pj_status_t mod_on_tx_msg(pjsip_tx_data *tdata) return PJSIP_EMSGTOOLONG; } pj_assert(size != 0); - tdata->buf.cur += size; tdata->buf.cur[size] = '\0'; + tdata->buf.cur += size; } return PJ_SUCCESS; diff --git a/pjsip/src/pjsip/sip_transport_udp.c b/pjsip/src/pjsip/sip_transport_udp.c index c4dad6d6..19412f94 100644 --- a/pjsip/src/pjsip/sip_transport_udp.c +++ b/pjsip/src/pjsip/sip_transport_udp.c @@ -173,12 +173,26 @@ static void udp_on_read_complete( pj_ioqueue_key_t *key, flags = 0; } - /* Reset pool. */ - pj_pool_reset(rdata->tp_info.pool); - init_rdata((struct udp_transport*)rdata->tp_info.transport, - (unsigned)rdata->tp_info.tp_data, - rdata->tp_info.pool, - &rdata); + /* Reset pool. + * Need to copy rdata fields to temp variable because they will + * be invalid after pj_pool_reset(). + */ + { + pj_pool_t *rdata_pool = rdata->tp_info.pool; + struct udp_transport *rdata_tp ; + unsigned rdata_index; + + rdata_tp = (struct udp_transport*)rdata->tp_info.transport; + rdata_index = (unsigned)rdata->tp_info.tp_data; + + pj_pool_reset(rdata_pool); + init_rdata(rdata_tp, rdata_index, rdata_pool, &rdata); + + /* Change some vars to point to new location after + * pool reset. + */ + op_key = &rdata->tp_info.op_key.op_key; + } /* Read next packet. */ bytes_read = sizeof(rdata->pkt_info.packet); |