Changeset 3190


Ignore:
Timestamp:
Jun 2, 2010 3:03:43 AM (9 years ago)
Author:
bennylp
Message:

Fixed #1092 (Crash when receiving various messages with "Contact: *" header format)

Location:
pjproject/trunk/pjsip/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip-ua/sip_inv.c

    r3094 r3190  
    751751    pjsip_supported_hdr *sup_hdr; 
    752752    pjsip_require_hdr *req_hdr; 
     753    pjsip_contact_hdr *c_hdr; 
    753754    int code = 200; 
    754755    unsigned rem_option = 0; 
     
    784785    /* Init response header list */ 
    785786    pj_list_init(&res_hdr_list); 
     787 
     788    /* Check the Contact header */ 
     789    c_hdr = (pjsip_contact_hdr*) 
     790            pjsip_msg_find_hdr(msg, PJSIP_H_CONTACT, NULL); 
     791    if (!c_hdr || !c_hdr->uri) { 
     792        /* Missing Contact header or Contact contains "*" */ 
     793        pjsip_warning_hdr *w; 
     794        pj_str_t warn_text; 
     795 
     796        warn_text = pj_str("Bad/missing Contact header"); 
     797        w = pjsip_warning_hdr_create(rdata->tp_info.pool, 399, 
     798                                     pjsip_endpt_name(endpt), 
     799                                     &warn_text); 
     800        if (w) { 
     801            pj_list_push_back(&res_hdr_list, w); 
     802        } 
     803 
     804        code = PJSIP_SC_BAD_REQUEST; 
     805        status = PJSIP_ERRNO_FROM_SIP_STATUS(code); 
     806        goto on_return; 
     807    } 
    786808 
    787809    /* Check the request body, see if it's something that we support, 
  • pjproject/trunk/pjsip/src/pjsip/sip_dialog.c

    r3068 r3190  
    433433                                         pos); 
    434434        if (contact_hdr) { 
    435             if (!PJSIP_URI_SCHEME_IS_SIP(contact_hdr->uri) &&  
    436                 !PJSIP_URI_SCHEME_IS_SIPS(contact_hdr->uri)) 
     435            if (!contact_hdr->uri || 
     436                (!PJSIP_URI_SCHEME_IS_SIP(contact_hdr->uri) && 
     437                 !PJSIP_URI_SCHEME_IS_SIPS(contact_hdr->uri))) 
    437438            { 
    438439                pos = (pjsip_hdr*)contact_hdr->next; 
     
    612613    contact = (const pjsip_contact_hdr*) 
    613614              pjsip_msg_find_hdr(msg, PJSIP_H_CONTACT, NULL); 
    614     if (contact == NULL) 
     615    if (contact == NULL || contact->uri == NULL) 
    615616        return PJSIP_EMISSINGHDR; 
    616617 
     
    15021503 
    15031504 
    1504 /* This function is called by user agent upon receiving incoming response 
     1505/* This function is called by user agent upon receiving incoming request 
    15051506 * message. 
    15061507 */ 
     
    15891590                  pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT,  
    15901591                                     NULL); 
    1591         if (contact && (dlg->remote.contact==NULL || 
    1592                         pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI,  
    1593                                       dlg->remote.contact->uri,  
    1594                                       contact->uri))) 
     1592        if (contact && contact->uri && 
     1593            (dlg->remote.contact==NULL || 
     1594             pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI, 
     1595                           dlg->remote.contact->uri, 
     1596                           contact->uri))) 
    15951597        { 
    15961598            dlg->remote.contact = (pjsip_contact_hdr*)  
     
    17941796                  pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT,  
    17951797                                     NULL); 
    1796         if (contact && (dlg->remote.contact==NULL || 
    1797                         pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI,  
    1798                                       dlg->remote.contact->uri,  
    1799                                       contact->uri))) 
     1798        if (contact && contact->uri && 
     1799            (dlg->remote.contact==NULL || 
     1800             pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI, 
     1801                           dlg->remote.contact->uri, 
     1802                           contact->uri))) 
    18001803        { 
    18011804            dlg->remote.contact = (pjsip_contact_hdr*)  
     
    18441847                                                          PJSIP_H_CONTACT,  
    18451848                                                          NULL); 
    1846         if (contact && (dlg->remote.contact==NULL || 
    1847                         pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI,  
    1848                                       dlg->remote.contact->uri,  
    1849                                       contact->uri))) 
     1849        if (contact && contact->uri && 
     1850            (dlg->remote.contact==NULL || 
     1851             pjsip_uri_cmp(PJSIP_URI_IN_REQ_URI, 
     1852                           dlg->remote.contact->uri, 
     1853                           contact->uri))) 
    18501854        { 
    18511855            dlg->remote.contact = (pjsip_contact_hdr*)  
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c

    r3185 r3190  
    22382238                                           pos); 
    22392239            if (h_contact) { 
    2240                 uri = (pjsip_uri*) pjsip_uri_get_uri(h_contact->uri); 
    2241                 if (!PJSIP_URI_SCHEME_IS_SIP(uri) &&  
    2242                     !PJSIP_URI_SCHEME_IS_SIPS(uri)) 
     2240                if (h_contact->uri) 
     2241                    uri = (pjsip_uri*) pjsip_uri_get_uri(h_contact->uri); 
     2242                else 
     2243                    uri = NULL; 
     2244                if (!uri || (!PJSIP_URI_SCHEME_IS_SIP(uri) && 
     2245                             !PJSIP_URI_SCHEME_IS_SIPS(uri))) 
    22432246                { 
    22442247                    pos = (pjsip_hdr*)h_contact->next; 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_im.c

    r2923 r3190  
    170170                  pjsip_msg_find_hdr(rdata->msg_info.msg, PJSIP_H_CONTACT, 
    171171                                     NULL); 
    172     if (contact_hdr) { 
     172    if (contact_hdr && contact_hdr->uri) { 
    173173        contact.ptr = (char*) pj_pool_alloc(rdata->tp_info.pool,  
    174174                                            PJSIP_MAX_URL_SIZE); 
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_pres.c

    r3096 r3190  
    16111611                  pjsip_msg_find_hdr(event->body.rx_msg.rdata->msg_info.msg, 
    16121612                                     PJSIP_H_CONTACT, NULL); 
    1613     if (!contact_hdr) { 
     1613    if (!contact_hdr || !contact_hdr->uri) { 
    16141614        return; 
    16151615    } 
Note: See TracChangeset for help on using the changeset viewer.