Ignore:
Timestamp:
Feb 1, 2007 3:37:11 AM (15 years ago)
Author:
bennylp
Message:

Fixed ticket #84: pjsua_transport_close() doesn't properly close transport (especially TLS)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjsip/src/pjsua-lib/pjsua_core.c

    r885 r923  
    12851285                                           pj_bool_t force ) 
    12861286{ 
     1287    pj_status_t status; 
     1288 
    12871289    /* Make sure id is in range. */ 
    12881290    PJ_ASSERT_RETURN(id>=0 && id<PJ_ARRAY_SIZE(pjsua_var.tpdata), PJ_EINVAL); 
     
    12971299        switch (pjsua_var.tpdata[id].type) { 
    12981300        case PJSIP_TRANSPORT_UDP: 
    1299             return pjsip_transport_destroy(pjsua_var.tpdata[id].data.tp); 
     1301            status = pjsip_transport_shutdown(pjsua_var.tpdata[id].data.tp); 
     1302            if (status  != PJ_SUCCESS) 
     1303                return status; 
     1304            status = pjsip_transport_destroy(pjsua_var.tpdata[id].data.tp); 
     1305            if (status != PJ_SUCCESS) 
     1306                return status; 
     1307            break; 
     1308 
     1309        case PJSIP_TRANSPORT_TLS: 
    13001310        case PJSIP_TRANSPORT_TCP: 
     1311            /* This will close the TCP listener, but existing TCP/TLS 
     1312             * connections (if any) will still linger  
     1313             */ 
     1314            status = (*pjsua_var.tpdata[id].data.factory->destroy) 
     1315                        (pjsua_var.tpdata[id].data.factory); 
     1316            if (status != PJ_SUCCESS) 
     1317                return status; 
     1318 
    13011319            break; 
     1320 
    13021321        default: 
    1303             break; 
     1322            return PJ_EINVAL; 
    13041323        } 
    13051324         
    13061325    } else { 
     1326        /* If force is not specified, transports will be closed at their 
     1327         * convenient time. However this will leak PJSUA-API transport 
     1328         * descriptors as PJSUA-API wouldn't know when exactly the 
     1329         * transport is closed thus it can't cleanup PJSUA transport 
     1330         * descriptor. 
     1331         */ 
    13071332        switch (pjsua_var.tpdata[id].type) { 
    13081333        case PJSIP_TRANSPORT_UDP: 
    13091334            return pjsip_transport_shutdown(pjsua_var.tpdata[id].data.tp); 
     1335        case PJSIP_TRANSPORT_TLS: 
    13101336        case PJSIP_TRANSPORT_TCP: 
    13111337            return (*pjsua_var.tpdata[id].data.factory->destroy) 
    13121338                        (pjsua_var.tpdata[id].data.factory); 
    13131339        default: 
    1314             break; 
    1315         } 
    1316     } 
    1317  
    1318     /* Unreachable */ 
    1319     pj_assert(!"Unknown transport"); 
    1320     return PJ_EINVALIDOP; 
     1340            return PJ_EINVAL; 
     1341        } 
     1342    } 
     1343 
     1344    /* Cleanup pjsua data when force is applied */ 
     1345    if (force) { 
     1346        pjsua_var.tpdata[id].type = PJSIP_TRANSPORT_UNSPECIFIED; 
     1347        pjsua_var.tpdata[id].data.ptr = NULL; 
     1348    } 
     1349 
     1350    return PJ_SUCCESS; 
    13211351} 
    13221352 
Note: See TracChangeset for help on using the changeset viewer.