keith has submitted this change and it was merged. ( 
https://gerrit.osmocom.org/c/osmo-sip-connector/+/15079 )

Change subject: In hold/retrieve/reinvite, add check that other_leg exists
......................................................................

In hold/retrieve/reinvite, add check that other_leg exists

We should always check that the other leg did not somehow
dissapear before accessing it.

Change-Id: I947aab6c0cc5019929bde1c7012e1a8c3d3472a5
---
M src/mncc.c
M src/sip.c
2 files changed, 31 insertions(+), 0 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve



diff --git a/src/mncc.c b/src/mncc.c
index 739f50b..f5a44d5 100644
--- a/src/mncc.c
+++ b/src/mncc.c
@@ -703,6 +703,12 @@
        LOGP(DMNCC, LOGL_DEBUG,
                "leg(%u) is requesting hold.\n", leg->callref);
        other_leg = call_leg_other(&leg->base);
+       if (!other_leg) {
+               LOGP(DMNCC, LOGL_ERROR, "leg(%u) other leg gone!\n",
+                       leg->callref);
+               mncc_send(leg->conn, MNCC_HOLD_REJ, leg->callref);
+               return;
+       }
        other_leg->hold_call(other_leg);
        mncc_send(leg->conn, MNCC_HOLD_CNF, leg->callref);
        leg->state = MNCC_CC_HOLD;
@@ -721,6 +727,14 @@
        LOGP(DMNCC, LOGL_DEBUG,
                "leg(%u) is requesting unhold.\n", leg->callref);
        other_leg = call_leg_other(&leg->base);
+       if (!other_leg) {
+               /* The SIP leg went away while we were holding! */
+               LOGP(DMNCC, LOGL_ERROR, "leg(%u) other leg gone!\n",
+                       leg->callref);
+               mncc_send(leg->conn, MNCC_RETRIEVE_CNF, leg->callref);
+               mncc_call_leg_release(&leg->base);
+               return;
+       }
        other_leg->retrieve_call(other_leg);
        mncc_send(leg->conn, MNCC_RETRIEVE_CNF, leg->callref);
        /* In case of call waiting/swap, At this point we need to tell the MSC 
to send
diff --git a/src/sip.c b/src/sip.c
index 103eb33..2b28b4e 100644
--- a/src/sip.c
+++ b/src/sip.c
@@ -193,6 +193,13 @@
        LOGP(DSIP, LOGL_INFO, "re-INVITE for call %s\n", 
sip->sip_call_id->i_id);

        struct call_leg *other = call_leg_other(&leg->base);
+
+       if (!other) {
+               LOGP(DMNCC, LOGL_ERROR, "leg(%p) other leg gone!\n", leg);
+               sip_release_call(&leg->base);
+               return;
+       }
+
        if (!sdp_get_sdp_mode(sip, &mode)) {
                /* re-INVITE with no SDP.
                 * We should respond with SDP reflecting current session
@@ -540,6 +547,11 @@
        OSMO_ASSERT(_leg->type == CALL_TYPE_SIP);
        leg = (struct sip_call_leg *) _leg;
        other_leg = call_leg_other(&leg->base);
+       if (!other_leg) {
+               LOGP(DMNCC, LOGL_ERROR, "leg(%p) other leg gone!\n", leg);
+               sip_release_call(&leg->base);
+               return;
+       }
        char *sdp = sdp_create_file(leg, other_leg, sdp_sendonly);
        nua_invite(leg->nua_handle,
                    NUTAG_MEDIA_ENABLE(0),
@@ -557,6 +569,11 @@
        OSMO_ASSERT(_leg->type == CALL_TYPE_SIP);
        leg = (struct sip_call_leg *) _leg;
        other_leg = call_leg_other(&leg->base);
+       if (!other_leg) {
+               LOGP(DMNCC, LOGL_ERROR, "leg(%p) other leg gone!\n", leg);
+               sip_release_call(&leg->base);
+               return;
+       }
        char *sdp = sdp_create_file(leg, other_leg, sdp_sendrecv);
        nua_invite(leg->nua_handle,
                    NUTAG_MEDIA_ENABLE(0),

--
To view, visit https://gerrit.osmocom.org/c/osmo-sip-connector/+/15079
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-sip-connector
Gerrit-Branch: master
Gerrit-Change-Id: I947aab6c0cc5019929bde1c7012e1a8c3d3472a5
Gerrit-Change-Number: 15079
Gerrit-PatchSet: 3
Gerrit-Owner: keith <ke...@rhizomatica.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: keith <ke...@rhizomatica.org>
Gerrit-Reviewer: laforge <lafo...@gnumonks.org>
Gerrit-Reviewer: pespin <pes...@sysmocom.de>
Gerrit-MessageType: merged

Reply via email to