Changeset 5214


Ignore:
Timestamp:
Dec 11, 2015 4:59:56 AM (9 years ago)
Author:
ming
Message:

Fixed #1901: crash when async_cnt is set to a value greater than one for SIP TLS transport

Location:
pjproject/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjlib/include/pj/ssl_sock.h

    r5087 r5214  
    865865 
    866866/** 
     867 * Duplicate pj_ssl_sock_param. 
     868 * 
     869 * @param pool  Pool to allocate memory. 
     870 * @param dst   Destination parameter. 
     871 * @param src   Source parameter. 
     872 */ 
     873PJ_DECL(void) pj_ssl_sock_param_copy(pj_pool_t *pool,  
     874                                     pj_ssl_sock_param *dst, 
     875                                     const pj_ssl_sock_param *src); 
     876 
     877 
     878/** 
    867879 * Create secure socket instance. 
    868880 * 
     
    11161128 
    11171129/** 
     1130 * Same as #pj_ssl_sock_start_accept(), but application can provide 
     1131 * a secure socket parameter, which will be used to create a new secure 
     1132 * socket reported in \a on_accept_complete() callback when there is 
     1133 * an incoming connection. 
     1134 * 
     1135 * @param ssock         The secure socket. 
     1136 * @param pool          Pool used to allocate some internal data for the 
     1137 *                      operation. 
     1138 * @param localaddr     Local address to bind on. 
     1139 * @param addr_len      Length of buffer containing local address. 
     1140 * @param newsock_param Secure socket parameter for new accepted sockets. 
     1141 * 
     1142 * @return              PJ_SUCCESS if the operation has been successful, 
     1143 *                      or the appropriate error code on failure. 
     1144 */ 
     1145PJ_DECL(pj_status_t) 
     1146pj_ssl_sock_start_accept2(pj_ssl_sock_t *ssock, 
     1147                          pj_pool_t *pool, 
     1148                          const pj_sockaddr_t *local_addr, 
     1149                          int addr_len, 
     1150                          const pj_ssl_sock_param *newsock_param); 
     1151 
     1152 
     1153/** 
    11181154 * Starts asynchronous socket connect() operation and SSL/TLS handshaking  
    11191155 * for this socket. Once the connection is done (either successfully or not), 
  • pjproject/trunk/pjlib/src/pj/ssl_sock_common.c

    r4860 r5214  
    2020#include <pj/assert.h> 
    2121#include <pj/errno.h> 
     22#include <pj/pool.h> 
    2223#include <pj/string.h> 
    2324 
     
    4647    /* Security config */ 
    4748    param->proto = PJ_SSL_SOCK_PROTO_DEFAULT; 
     49} 
     50 
     51 
     52/* 
     53 * Duplicate SSL socket parameter. 
     54 */ 
     55PJ_DEF(void) pj_ssl_sock_param_copy( pj_pool_t *pool,  
     56                                     pj_ssl_sock_param *dst, 
     57                                     const pj_ssl_sock_param *src) 
     58{ 
     59    /* Init secure socket param */ 
     60    pj_memcpy(dst, src, sizeof(*dst)); 
     61    if (src->ciphers_num > 0) { 
     62        unsigned i; 
     63        dst->ciphers = (pj_ssl_cipher*) 
     64                        pj_pool_calloc(pool, src->ciphers_num,  
     65                                       sizeof(pj_ssl_cipher)); 
     66        for (i = 0; i < src->ciphers_num; ++i) 
     67            dst->ciphers[i] = src->ciphers[i]; 
     68    } 
     69 
     70    if (src->server_name.slen) { 
     71        /* Server name must be null-terminated */ 
     72        pj_strdup_with_null(pool, &dst->server_name, &src->server_name); 
     73    } 
    4874} 
    4975 
  • pjproject/trunk/pjlib/src/pj/ssl_sock_ossl.c

    r5087 r5214  
    142142    pj_ssl_sock_t        *parent; 
    143143    pj_ssl_sock_param     param; 
     144    pj_ssl_sock_param     newsock_param; 
    144145    pj_ssl_cert_t        *cert; 
    145146     
     
    17581759    pj_status_t status; 
    17591760 
    1760     PJ_UNUSED_ARG(src_addr_len); 
    1761  
    17621761    /* Create new SSL socket instance */ 
    1763     status = pj_ssl_sock_create(ssock_parent->pool, &ssock_parent->param, 
    1764                                 &ssock); 
     1762    status = pj_ssl_sock_create(ssock_parent->pool, 
     1763                                &ssock_parent->newsock_param, &ssock); 
    17651764    if (status != PJ_SUCCESS) 
    17661765        goto on_return; 
     
    21842183 
    21852184    /* Init secure socket param */ 
    2186     ssock->param = *param; 
     2185    pj_ssl_sock_param_copy(pool, &ssock->param, param); 
    21872186    ssock->param.read_buffer_size = ((ssock->param.read_buffer_size+7)>>3)<<3; 
    2188     if (param->ciphers_num > 0) { 
    2189         unsigned i; 
    2190         ssock->param.ciphers = (pj_ssl_cipher*) 
    2191                                pj_pool_calloc(pool, param->ciphers_num,  
    2192                                               sizeof(pj_ssl_cipher)); 
    2193         for (i = 0; i < param->ciphers_num; ++i) 
    2194             ssock->param.ciphers[i] = param->ciphers[i]; 
    2195     } 
    2196  
    2197     /* Server name must be null-terminated */ 
    2198     pj_strdup_with_null(pool, &ssock->param.server_name,  
    2199                         &param->server_name); 
    22002187 
    22012188    /* Finally */ 
     
    26182605                                              int addr_len) 
    26192606{ 
     2607    return pj_ssl_sock_start_accept2(ssock, pool, localaddr, addr_len, 
     2608                                     &ssock->param); 
     2609} 
     2610 
     2611 
     2612/** 
     2613 * Same as #pj_ssl_sock_start_accept(), but application provides parameter 
     2614 * for new accepted secure sockets. 
     2615 */ 
     2616PJ_DEF(pj_status_t) 
     2617pj_ssl_sock_start_accept2(pj_ssl_sock_t *ssock, 
     2618                          pj_pool_t *pool, 
     2619                          const pj_sockaddr_t *localaddr, 
     2620                          int addr_len, 
     2621                          const pj_ssl_sock_param *newsock_param) 
     2622{ 
    26202623    pj_activesock_cb asock_cb; 
    26212624    pj_activesock_cfg asock_cfg; 
     
    26232626 
    26242627    PJ_ASSERT_RETURN(ssock && pool && localaddr && addr_len, PJ_EINVAL); 
     2628 
     2629    /* Verify new socket parameters */ 
     2630    if (newsock_param->grp_lock != ssock->param.grp_lock || 
     2631        newsock_param->sock_af != ssock->param.sock_af || 
     2632        newsock_param->sock_type != ssock->param.sock_type) 
     2633    { 
     2634        return PJ_EINVAL; 
     2635    } 
    26252636 
    26262637    /* Create socket */ 
     
    26922703 
    26932704    /* Start accepting */ 
     2705    pj_ssl_sock_param_copy(pool, &ssock->newsock_param, newsock_param); 
    26942706    status = pj_activesock_start_accept(ssock->asock, pool); 
    26952707    if (status != PJ_SUCCESS) 
  • pjproject/trunk/pjsip/src/pjsip/sip_transport_tls.c

    r5212 r5214  
    315315    pj_uint32_t sip_ssl_proto; 
    316316    struct tls_listener *listener; 
    317     pj_ssl_sock_param ssock_param; 
     317    pj_ssl_sock_param ssock_param, newsock_param; 
    318318    pj_sockaddr *listener_addr; 
    319319    pj_bool_t has_listener; 
     
    472472    has_listener = PJ_FALSE; 
    473473 
    474     status = pj_ssl_sock_start_accept(listener->ssock, pool,  
     474    pj_memcpy(&newsock_param, &ssock_param, sizeof(newsock_param)); 
     475    newsock_param.async_cnt = 1; 
     476    newsock_param.cb.on_data_read = &on_data_read; 
     477    newsock_param.cb.on_data_sent = &on_data_sent; 
     478    status = pj_ssl_sock_start_accept2(listener->ssock, pool,  
    475479                          (pj_sockaddr_t*)listener_addr,  
    476                           pj_sockaddr_get_len((pj_sockaddr_t*)listener_addr)); 
     480                          pj_sockaddr_get_len((pj_sockaddr_t*)listener_addr), 
     481                          &newsock_param); 
    477482    if (status == PJ_SUCCESS || status == PJ_EPENDING) { 
    478483        pj_ssl_sock_info info; 
Note: See TracChangeset for help on using the changeset viewer.