chan_sip.c: chan_sip unstable with TLS after asterisk start or reloads
authorhajekd <david.hajek@daktela.com>
Mon, 3 Sep 2018 14:55:04 +0000 (16:55 +0200)
committerJoshua Colp <jcolp@digium.com>
Thu, 20 Sep 2018 14:00:55 +0000 (09:00 -0500)
Fixes random asterisk crash on start or reload with TLS phones.

ASTERISK-28034 #close
Reported-by: David Hajek

Change-Id: I2a859f97dc80c348e2fa56e918214ee29521c4ac

channels/chan_sip.c

index e375bfe..5563a9a 100644 (file)
@@ -2617,7 +2617,8 @@ static int sip_tcptls_write(struct ast_tcptls_session_instance *tcptls_session,
 
        ao2_lock(tcptls_session);
 
-       if (!(th = ao2_t_find(threadt, &tmp, OBJ_POINTER, "ao2_find, getting sip_threadinfo in tcp helper thread")) ||
+       if (!tcptls_session->stream ||
+               !(th = ao2_t_find(threadt, &tmp, OBJ_POINTER, "ao2_find, getting sip_threadinfo in tcp helper thread")) ||
                !(packet = ao2_alloc(sizeof(*packet), tcptls_packet_destructor)) ||
                !(packet->data = ast_str_create(len))) {
                goto tcptls_write_setup_error;
@@ -3139,7 +3140,7 @@ static void *_sip_tcp_helper_thread(struct ast_tcptls_session_instance *tcptls_s
 
                        if (read(me->alert_pipe[0], &alert, sizeof(alert)) == -1) {
                                ast_log(LOG_ERROR, "read() failed: %s\n", strerror(errno));
-                               continue;
+                               goto cleanup;
                        }
 
                        switch (alert) {
@@ -3157,10 +3158,13 @@ static void *_sip_tcp_helper_thread(struct ast_tcptls_session_instance *tcptls_s
                                                ast_log(LOG_WARNING, "Failure to write to tcp/tls socket\n");
                                        }
                                        ao2_t_ref(packet, -1, "tcptls packet sent, this is no longer needed");
+                               } else {
+                                       goto cleanup;
                                }
                                break;
                        default:
                                ast_log(LOG_ERROR, "Unknown tcptls thread alert '%u'\n", alert);
+                               goto cleanup;
                        }
                }
        }