diff options
author | Benny Prijono <bennylp@teluu.com> | 2008-02-15 17:26:47 +0000 |
---|---|---|
committer | Benny Prijono <bennylp@teluu.com> | 2008-02-15 17:26:47 +0000 |
commit | b7cbebc44db23b99cc05a9ca57adff1dd6429868 (patch) | |
tree | f1308d35027280ca8074164ed35fcaccc2b02728 /pjsip | |
parent | 118a635a4592af6f43735fe3f8c300834f21d3af (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')
-rw-r--r-- | pjsip/src/pjsip/sip_transport.c | 29 |
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; |