From 553b16dfa115b8985810b749390c8262d72fc38e Mon Sep 17 00:00:00 2001 From: mom040267 Date: Sun, 20 Jul 2014 06:18:26 +0000 Subject: [PATCH] working on crashes --- ChangeLog | 1 + src/apps/relay/netengine.c | 111 +++++++++++++++++++++++++++---------- 2 files changed, 82 insertions(+), 30 deletions(-) diff --git a/ChangeLog b/ChangeLog index 884a3796..a00ca20f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,7 @@ Version 4.1.0.1 'Vitari': - STUN BINDING response fixed in the case of -X (external address) option. - "pu" CLI command fixed. - session cleaning fixed in TCP relay functionality (RFC 6062). + - some crash conditions fixed. - working on compilation warnings. 06/13/2014 Oleg Moskalenko diff --git a/src/apps/relay/netengine.c b/src/apps/relay/netengine.c index 6ce5e13a..8f7f7e1d 100644 --- a/src/apps/relay/netengine.c +++ b/src/apps/relay/netengine.c @@ -401,6 +401,11 @@ static void auth_server_receive_message(struct bufferevent *bev, void *ptr) TURN_LOG_LEVEL_ERROR, "%s: Too large UDP relay number: %d\n", __FUNCTION__,(int)dest); + } else if(!(udp_relay_servers[dest])) { + TURN_LOG_FUNC( + TURN_LOG_LEVEL_ERROR, + "%s: Wrong UDP relay number: %d, total %d\n", + __FUNCTION__,(int)dest, (int)get_real_udp_relay_servers_number()); } else { output = bufferevent_get_output(udp_relay_servers[dest]->auth_out_buf); } @@ -408,8 +413,13 @@ static void auth_server_receive_message(struct bufferevent *bev, void *ptr) if(dest >= get_real_general_relay_servers_number()) { TURN_LOG_FUNC( TURN_LOG_LEVEL_ERROR, - "%s: Too large general relay number: %d\n", - __FUNCTION__,(int)dest); + "%s: Too large general relay number: %d, total %d\n", + __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number()); + } else if(!(general_relay_servers[dest])) { + TURN_LOG_FUNC( + TURN_LOG_LEVEL_ERROR, + "%s: Wrong general relay number: %d, total %d\n", + __FUNCTION__,(int)dest,(int)get_real_general_relay_servers_number()); } else { output = bufferevent_get_output(general_relay_servers[dest]->auth_out_buf); } @@ -437,37 +447,38 @@ static int send_socket_to_general_relay(ioa_engine_handle e, struct message_to_r smptr->t = RMT_SOCKET; - { - struct evbuffer *output = NULL; - int success = 0; + struct evbuffer *output = NULL; + int success = 0; - output = bufferevent_get_output(rdest->out_buf); + if(!rdest) { + success = -1; + goto label_end; + } - if(output) { + output = bufferevent_get_output(rdest->out_buf); - if(evbuffer_add(output,smptr,sizeof(struct message_to_relay))<0) { - TURN_LOG_FUNC( - TURN_LOG_LEVEL_ERROR, - "%s: Cannot add message to relay output buffer\n", - __FUNCTION__); - } else { + if(output) { - success = 1; - smptr->m.sm.nd.nbh=NULL; - } - - } - - if(!success) { - ioa_network_buffer_delete(e, smptr->m.sm.nd.nbh); + if(evbuffer_add(output,smptr,sizeof(struct message_to_relay))<0) { + TURN_LOG_FUNC( + TURN_LOG_LEVEL_ERROR, + "%s: Cannot add message to relay output buffer\n", + __FUNCTION__); + } else { + success = 1; smptr->m.sm.nd.nbh=NULL; - - IOA_CLOSE_SOCKET(smptr->m.sm.s); - - return -1; } } + label_end: + + if(!success) { + ioa_network_buffer_delete(e, smptr->m.sm.nd.nbh); + smptr->m.sm.nd.nbh=NULL; + IOA_CLOSE_SOCKET(smptr->m.sm.s); + return -1; + } + return 0; } @@ -487,23 +498,39 @@ static int send_socket_to_relay(turnserver_id id, u64bits cid, stun_tid *tid, io if(dest >= get_real_udp_relay_servers_number()) { TURN_LOG_FUNC( TURN_LOG_LEVEL_ERROR, - "%s: Too large UDP relay number: %d, rmt=%d\n", - __FUNCTION__,(int)dest,(int)rmt); + "%s: Too large UDP relay number: %d, rmt=%d, total=%d\n", + __FUNCTION__,(int)dest,(int)rmt, (int)get_real_udp_relay_servers_number()); ret = -1; goto err; } rs = udp_relay_servers[dest]; + if(!rs) { + TURN_LOG_FUNC( + TURN_LOG_LEVEL_ERROR, + "%s: Wrong UDP relay number: %d, rmt=%d, total=%d\n", + __FUNCTION__,(int)dest,(int)rmt, (int)get_real_udp_relay_servers_number()); + ret = -1; + goto err; + } } else { size_t dest = id; if(dest >= get_real_general_relay_servers_number()) { TURN_LOG_FUNC( TURN_LOG_LEVEL_ERROR, - "%s: Too large general relay number: %d, rmt=%d\n", - __FUNCTION__,(int)dest,(int)rmt); + "%s: Too large general relay number: %d, rmt=%d, total=%d\n", + __FUNCTION__,(int)dest,(int)rmt, (int)get_real_general_relay_servers_number()); ret = -1; goto err; } rs = general_relay_servers[dest]; + if(!rs) { + TURN_LOG_FUNC( + TURN_LOG_LEVEL_ERROR, + "%s: Wrong general relay number: %d, rmt=%d, total=%d\n", + __FUNCTION__,(int)dest,(int)rmt, (int)get_real_general_relay_servers_number()); + ret = -1; + goto err; + } } switch (rmt) { @@ -749,7 +776,12 @@ static void listener_receive_message(struct bufferevent *bev, void *ptr) if(turn_params.net_engine_version == NEV_UDP_SOCKET_PER_THREAD) { size_t ri; for(ri=0;rithr == pthread_self()) { + if(!(general_relay_servers[ri])) { + TURN_LOG_FUNC( + TURN_LOG_LEVEL_ERROR, + "%s: Wrong general relay number: %d, total %d\n", + __FUNCTION__,(int)ri,(int)get_real_general_relay_servers_number()); + } else if(general_relay_servers[ri]->thr == pthread_self()) { relay_thread_index=ri; break; } @@ -1655,6 +1687,25 @@ void setup_server(void) setup_tcp_listener_servers(turn_params.listener.ioa_eng, NULL); } + { + int tot = 0; + if(udp_relay_servers[0]) { + tot = get_real_udp_relay_servers_number(); + } + TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Total UDP servers: %d\n",(int)tot); + } + + { + int tot = get_real_general_relay_servers_number(); + TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO,"Total General servers: %d\n",(int)tot); + int i; + for(i = 0;i