diff options
author | Benny Prijono <bennylp@teluu.com> | 2006-03-01 19:28:08 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2006-03-01 19:28:08 +0000 |
commit | afed82d0613050254f3d877292342e7cc92bc02f (patch) | |
tree | c100b263a4423581ec589631392264d21cf87e28 | |
parent | e067eb31fc0161c34c1af1595415bfeeccd29789 (diff) |
Fixed bug where rdata is not reset properly causing memory to grow indefinitely
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@252 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjsip/include/pjsip/sip_transport.h | 3 | ||||
-rw-r--r-- | pjsip/src/pjsip/sip_transport_udp.c | 45 |
2 files changed, 39 insertions, 9 deletions
diff --git a/pjsip/include/pjsip/sip_transport.h b/pjsip/include/pjsip/sip_transport.h index 5160bfbb..ce256f09 100644 --- a/pjsip/include/pjsip/sip_transport.h +++ b/pjsip/include/pjsip/sip_transport.h @@ -164,6 +164,9 @@ struct pjsip_rx_data /** The transport object which received this packet. */ pjsip_transport *transport; + /** Other transport specific data to be attached to this buffer. */ + void *tp_data; + /** Ioqueue key. */ pjsip_rx_data_op_key op_key; diff --git a/pjsip/src/pjsip/sip_transport_udp.c b/pjsip/src/pjsip/sip_transport_udp.c index 4a40dcba..13a89975 100644 --- a/pjsip/src/pjsip/sip_transport_udp.c +++ b/pjsip/src/pjsip/sip_transport_udp.c @@ -41,6 +41,34 @@ struct udp_transport /* + * Initialize transport's receive buffer from the specified pool. + */ +static void init_rdata(struct udp_transport *tp, unsigned rdata_index, + pj_pool_t *pool, pjsip_rx_data **p_rdata) +{ + pjsip_rx_data *rdata; + + /* Reset pool. */ + pj_pool_reset(pool); + + rdata = pj_pool_zalloc(pool, sizeof(pjsip_rx_data)); + + /* Init tp_info part. */ + rdata->tp_info.pool = pool; + rdata->tp_info.transport = &tp->base; + rdata->tp_info.tp_data = (void*) rdata_index; + rdata->tp_info.op_key.rdata = rdata; + pj_ioqueue_op_key_init(&rdata->tp_info.op_key.op_key, + sizeof(pj_ioqueue_op_key_t)); + + tp->rdata[rdata_index] = rdata; + + if (p_rdata) + *p_rdata = rdata; +} + + +/* * udp_on_read_complete() * * This is callback notification from ioqueue that a pending recvfrom() @@ -116,6 +144,13 @@ 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); + /* Read next packet. */ bytes_read = sizeof(rdata->pkt_info.packet); rdata->pkt_info.src_addr_len = sizeof(rdata->pkt_info.src_addr); @@ -412,15 +447,7 @@ PJ_DEF(pj_status_t) pjsip_udp_transport_attach( pjsip_endpoint *endpt, return PJ_ENOMEM; } - tp->rdata[i] = pj_pool_zalloc(rdata_pool, sizeof(pjsip_rx_data)); - - /* Init tp_info part. */ - tp->rdata[i]->tp_info.pool = rdata_pool; - tp->rdata[i]->tp_info.transport = &tp->base; - tp->rdata[i]->tp_info.op_key.rdata = tp->rdata[i]; - pj_ioqueue_op_key_init(&tp->rdata[i]->tp_info.op_key.op_key, - sizeof(pj_ioqueue_op_key_t)); - + init_rdata(tp, i, rdata_pool, NULL); tp->rdata_cnt++; } |