summaryrefslogtreecommitdiff
path: root/pjsip/src
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2008-02-15 17:26:47 +0000
committerBenny Prijono <bennylp@teluu.com>2008-02-15 17:26:47 +0000
commitb7cbebc44db23b99cc05a9ca57adff1dd6429868 (patch)
treef1308d35027280ca8074164ed35fcaccc2b02728 /pjsip/src
parent118a635a4592af6f43735fe3f8c300834f21d3af (diff)
Ticket #482: TCP keep-alive packets are corrupting SIP message (thanks Helmut Wolf)
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1800 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip/src')
-rw-r--r--pjsip/src/pjsip/sip_transport.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/pjsip/src/pjsip/sip_transport.c b/pjsip/src/pjsip/sip_transport.c
index 1dc62879..87d18606 100644
--- a/pjsip/src/pjsip/sip_transport.c
+++ b/pjsip/src/pjsip/sip_transport.c
@@ -1270,7 +1270,7 @@ PJ_DEF(pj_ssize_t) pjsip_tpmgr_receive_packet( pjsip_tpmgr *mgr,
pj_assert(rdata->pkt_info.len > 0);
if (rdata->pkt_info.len <= 0)
return -1;
-
+
current_pkt = rdata->pkt_info.packet;
remaining_len = rdata->pkt_info.len;
@@ -1283,13 +1283,29 @@ PJ_DEF(pj_ssize_t) pjsip_tpmgr_receive_packet( pjsip_tpmgr *mgr,
while (remaining_len > 0) {
pjsip_msg *msg;
+ char *p, *end;
+ char saved;
pj_size_t msg_fragment_size;
+ /* Skip leading newlines as pjsip_find_msg() currently can't
+ * handle leading newlines.
+ */
+ for (p=current_pkt, end=p+remaining_len; p!=end; ++p) {
+ if (*p != '\r' && *p != '\n')
+ break;
+ }
+ if (p!=current_pkt) {
+ remaining_len -= (p - current_pkt);
+ total_processed += (p - current_pkt);
+ current_pkt = p;
+ if (remaining_len == 0) {
+ return total_processed;
+ }
+ }
+
/* Initialize default fragment size. */
msg_fragment_size = remaining_len;
- /* Null terminate packet. */
-
/* Clear and init msg_info in rdata.
* Endpoint might inspect the values there when we call the callback
* to report some errors.
@@ -1319,10 +1335,17 @@ PJ_DEF(pj_ssize_t) pjsip_tpmgr_receive_packet( pjsip_tpmgr *mgr,
/* Update msg_info. */
rdata->msg_info.len = msg_fragment_size;
+ /* Null terminate packet */
+ saved = current_pkt[msg_fragment_size];
+ current_pkt[msg_fragment_size] = '\0';
+
/* Parse the message. */
rdata->msg_info.msg = msg =
pjsip_parse_rdata( current_pkt, msg_fragment_size, rdata);
+ /* Restore null termination */
+ current_pkt[msg_fragment_size] = saved;
+
/* Check for parsing syntax error */
if (msg==NULL || !pj_list_empty(&rdata->msg_info.parse_err)) {
pjsip_parser_err_report *err;