Ignore:
Timestamp:
Mar 17, 2009 11:25:52 AM (15 years ago)
Author:
bennylp
Message:

Ticket #755: segfault with IPv6 transport (thanks Cedric Levequ for the report)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_udp.c

    r2394 r2519  
    495495 
    496496    } else { 
     497        /* If bound address specifies "INADDR_ANY" (IPv6), get the 
     498         * IP address of local hostname 
     499         */ 
     500        pj_uint32_t loop6[4] = { 0, 0, 0, 0}; 
     501 
    497502        bound_name->port = pj_ntohs(tmp_addr.ipv6.sin6_port); 
     503 
     504        if (pj_memcmp(&tmp_addr.ipv6.sin6_addr, loop6, sizeof(loop6))==0) { 
     505            status = pj_gethostip(tmp_addr.addr.sa_family, &tmp_addr); 
     506            if (status != PJ_SUCCESS) 
     507                return status; 
     508        } 
     509 
    498510        status = pj_inet_ntop(tmp_addr.addr.sa_family,  
    499511                              pj_sockaddr_get_addr(&tmp_addr), 
    500512                              hostbuf, hostbufsz); 
     513        if (status == PJ_SUCCESS) { 
     514            bound_name->host.slen = pj_ansi_strlen(hostbuf); 
     515        } 
    501516    } 
    502517 
     
    510525{ 
    511526    enum { INFO_LEN = 80 }; 
    512     char local_addr[PJ_INET6_ADDRSTRLEN]; 
     527    char local_addr[PJ_INET6_ADDRSTRLEN+10]; 
    513528 
    514529    pj_assert(a_name->host.slen != 0); 
     
    522537    } 
    523538 
    524     pj_inet_ntop(tp->base.local_addr.addr.sa_family, 
    525                  pj_sockaddr_get_addr(&tp->base.local_addr),  
    526                  local_addr, sizeof(local_addr)); 
     539    pj_sockaddr_print(&tp->base.local_addr, local_addr, sizeof(local_addr), 3); 
    527540 
    528541    pj_ansi_snprintf(  
    529         tp->base.info, INFO_LEN, "udp %s:%d [published as %s:%d]", 
     542        tp->base.info, INFO_LEN, "udp %s [published as %s:%d]", 
    530543        local_addr, 
    531         pj_sockaddr_get_port(&tp->base.local_addr), 
    532544        tp->base.local_name.host.ptr, 
    533545        tp->base.local_name.port); 
     
    640652    pj_pool_t *pool; 
    641653    struct udp_transport *tp; 
    642     const char *format; 
     654    const char *format, *ipv6_quoteb, *ipv6_quotee; 
    643655    unsigned i; 
    644656    pj_status_t status; 
     
    648660 
    649661    /* Object name. */ 
    650     if (type & PJSIP_TRANSPORT_IPV6) 
     662    if (type & PJSIP_TRANSPORT_IPV6) { 
    651663        format = "udpv6%p"; 
    652     else 
     664        ipv6_quoteb = "["; 
     665        ipv6_quotee = "]"; 
     666    } else { 
    653667        format = "udp%p"; 
     668        ipv6_quoteb = ipv6_quotee = ""; 
     669    } 
    654670 
    655671    /* Create pool. */ 
     
    768784    if (p_transport) 
    769785        *p_transport = &tp->base; 
    770  
     786     
    771787    PJ_LOG(4,(tp->base.obj_name,  
    772               "SIP %s started, published address is %.*s:%d", 
     788              "SIP %s started, published address is %s%.*s%s:%d", 
    773789              pjsip_transport_get_type_desc((pjsip_transport_type_e)tp->base.key.type), 
     790              ipv6_quoteb, 
    774791              (int)tp->base.local_name.host.slen, 
    775792              tp->base.local_name.host.ptr, 
     793              ipv6_quotee, 
    776794              tp->base.local_name.port)); 
    777795 
     
    860878    pj_sock_t sock; 
    861879    pj_status_t status; 
    862     char addr_buf[PJ_INET_ADDRSTRLEN]; 
     880    char addr_buf[PJ_INET6_ADDRSTRLEN]; 
    863881    pjsip_host_port bound_name; 
    864882 
     
    884902    } 
    885903 
    886     return pjsip_udp_transport_attach( endpt, sock, a_name, async_cnt,  
    887                                        p_transport); 
     904    return pjsip_udp_transport_attach2(endpt, PJSIP_TRANSPORT_UDP6, 
     905                                       sock, a_name, async_cnt, p_transport); 
    888906} 
    889907 
     
    9821000 
    9831001    if (option & PJSIP_UDP_TRANSPORT_DESTROY_SOCKET) { 
    984         char addr_buf[PJ_INET_ADDRSTRLEN]; 
     1002        char addr_buf[PJ_INET6_ADDRSTRLEN]; 
    9851003        pjsip_host_port bound_name; 
    9861004 
Note: See TracChangeset for help on using the changeset viewer.