]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_t38: Make t38_reinvite_response_cb tolerant of NULL channel
authorGeorge Joseph <gjoseph@digium.com>
Tue, 5 Sep 2017 10:23:04 +0000 (04:23 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Tue, 5 Sep 2017 10:55:19 +0000 (05:55 -0500)
t38_reinvite_response_cb can get called by res_pjsip_session's
session_inv_on_tsx_state_changed in situations where session->channel
is NULL.  If it is, the ast_log warning segfaults because it tries
to get the channel name from a NULL channel.

* Check session->channel and print "unknown channel" when it's NULL.

ASTERISK-27236
Reported by: Ross Beer

Change-Id: I4326e288d36327f6c79ab52226d54905cdc87dc7

res/res_pjsip_t38.c

index 9f6ae0c2fe1a0ef3798f82752d609acc31b5441f..82b1c92b2498fd8be44668b8d3c4d16fa88de6c7 100644 (file)
@@ -294,21 +294,22 @@ static int t38_reinvite_response_cb(struct ast_sip_session *session, pjsip_rx_da
 {
        struct pjsip_status_line status = rdata->msg_info.msg->line.status;
        struct t38_state *state;
-       RAII_VAR(struct ast_sip_session_media *, session_media, NULL, ao2_cleanup);
+       struct ast_sip_session_media *session_media = NULL;
 
        if (status.code == 100) {
                return 0;
        }
 
-       if (!(state = t38_state_get_or_alloc(session)) ||
+       if (!session->channel || !(state = t38_state_get_or_alloc(session)) ||
                !(session_media = ao2_find(session->media, "image", OBJ_KEY))) {
                ast_log(LOG_WARNING, "Received response to T.38 re-invite on '%s' but state unavailable\n",
-                       ast_channel_name(session->channel));
+                       session->channel ? ast_channel_name(session->channel) : "unknown channel");
                return 0;
        }
 
        t38_change_state(session, session_media, state, (status.code == 200) ? T38_ENABLED : T38_REJECTED);
 
+       ao2_cleanup(session_media);
        return 0;
 }