Prevent crash from trying to end a session in an invalid way.
authorMark Michelson <mmichelson@digium.com>
Tue, 16 Jul 2013 19:13:04 +0000 (19:13 +0000)
committerMark Michelson <mmichelson@digium.com>
Tue, 16 Jul 2013 19:13:04 +0000 (19:13 +0000)
This ensures that code that was only meant to be run on a reinvite failure
only runs on a reinvite failure.

(closes issue ASTERISK-22061)
reported by Rusty Newton

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@394473 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_sip_session.c

index 6cf63b8..0b0ebe5 100644 (file)
@@ -1609,11 +1609,12 @@ static void session_inv_on_tsx_state_changed(pjsip_inv_session *inv, pjsip_trans
                                if (tsx->status_code == PJSIP_SC_REQUEST_PENDING) {
                                        reschedule_reinvite(session, tsx->mod_data[session_module.id], tsx->last_tx);
                                        return;
-                               } else {
-                                       /* Other failures result in destroying the session. */
+                               } else if (inv->state == PJSIP_INV_STATE_CONFIRMED) {
+                                       /* Other reinvite failures result in destroying the session. */
                                        pjsip_tx_data *tdata;
-                                       pjsip_inv_end_session(inv, 500, NULL, &tdata);
-                                       ast_sip_session_send_request(session, tdata);
+                                       if (pjsip_inv_end_session(inv, 500, NULL, &tdata) == PJ_SUCCESS) {
+                                               ast_sip_session_send_request(session, tdata);
+                                       }
                                }
                        }
                } else {