summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-03-01 19:28:08 +0000
committerBenny Prijono <bennylp@teluu.com>2006-03-01 19:28:08 +0000
commitafed82d0613050254f3d877292342e7cc92bc02f (patch)
treec100b263a4423581ec589631392264d21cf87e28
parente067eb31fc0161c34c1af1595415bfeeccd29789 (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.h3
-rw-r--r--pjsip/src/pjsip/sip_transport_udp.c45
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++;
}