]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
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)
committerSean Bright <sean.bright@gmail.com>
Fri, 7 Sep 2018 13:26:33 +0000 (09:26 -0400)
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 34b361c65d17f94323b0be090916dad8e51c9539..ab383d7f62d2e03da78462f874804c4e2e65c13b 100644 (file)
@@ -2575,7 +2575,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;
@@ -3097,7 +3098,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) {
@@ -3115,10 +3116,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;
                        }
                }
        }