<p>keith has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/15079">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">In hold/retreive/reinvite, add check that other_leg exists<br><br>We should always check that the other leg did not somehow<br>dissapear before accessing it.<br><br>Change-Id: I947aab6c0cc5019929bde1c7012e1a8c3d3472a5<br>---<br>M src/mncc.c<br>M src/sip.c<br>2 files changed, 31 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-sip-connector refs/changes/79/15079/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/mncc.c b/src/mncc.c</span><br><span>index 90eddc1..744e0ea 100644</span><br><span>--- a/src/mncc.c</span><br><span>+++ b/src/mncc.c</span><br><span>@@ -703,6 +703,12 @@</span><br><span>  LOGP(DMNCC, LOGL_DEBUG,</span><br><span>              "leg(%u) is requesting hold.\n", leg->callref);</span><br><span>         other_leg = call_leg_other(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!other_leg) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMNCC, LOGL_ERROR, "leg(%u) other leg gone!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        leg->callref);</span><br><span style="color: hsl(120, 100%, 40%);">+             mncc_send(leg->conn, MNCC_HOLD_REJ, leg->callref);</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    other_leg->hold_call(other_leg);</span><br><span>  mncc_send(leg->conn, MNCC_HOLD_CNF, leg->callref);</span><br><span>     leg->state = MNCC_CC_HOLD;</span><br><span>@@ -721,6 +727,14 @@</span><br><span>         LOGP(DMNCC, LOGL_DEBUG,</span><br><span>              "leg(%u) is requesting unhold.\n", leg->callref);</span><br><span>       other_leg = call_leg_other(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!other_leg) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* The SIP leg went away while we were holding! */</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DMNCC, LOGL_ERROR, "leg(%u) other leg gone!\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        leg->callref);</span><br><span style="color: hsl(120, 100%, 40%);">+             mncc_send(leg->conn, MNCC_RETRIEVE_CNF, leg->callref);</span><br><span style="color: hsl(120, 100%, 40%);">+          mncc_call_leg_release(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    other_leg->retrieve_call(other_leg);</span><br><span>      mncc_send(leg->conn, MNCC_RETRIEVE_CNF, leg->callref);</span><br><span>         /* In case of call waiting/swap, At this point we need to tell the MSC to send</span><br><span>diff --git a/src/sip.c b/src/sip.c</span><br><span>index c1e34d3..13bb183 100644</span><br><span>--- a/src/sip.c</span><br><span>+++ b/src/sip.c</span><br><span>@@ -193,6 +193,13 @@</span><br><span>       LOGP(DSIP, LOGL_NOTICE, "re-INVITE for call %s\n", sip->sip_call_id->i_id);</span><br><span> </span><br><span>      struct call_leg *other = call_leg_other(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!other) {</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DMNCC, LOGL_ERROR, "leg(%p) other leg gone!\n", leg);</span><br><span style="color: hsl(120, 100%, 40%);">+          sip_release_call(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!sdp_get_sdp_mode(sip, &mode)) {</span><br><span>             /* re-INVITE with no SDP.</span><br><span>             * We should respond with SDP reflecting current session</span><br><span>@@ -540,6 +547,11 @@</span><br><span>      OSMO_ASSERT(_leg->type == CALL_TYPE_SIP);</span><br><span>         leg = (struct sip_call_leg *) _leg;</span><br><span>  other_leg = call_leg_other(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!other_leg) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMNCC, LOGL_ERROR, "leg(%p) other leg gone!\n", leg);</span><br><span style="color: hsl(120, 100%, 40%);">+          sip_release_call(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    char *sdp = sdp_create_file(leg, other_leg, sdp_sendonly);</span><br><span>   nua_invite(leg->nua_handle,</span><br><span>                   NUTAG_MEDIA_ENABLE(0),</span><br><span>@@ -557,6 +569,11 @@</span><br><span>    OSMO_ASSERT(_leg->type == CALL_TYPE_SIP);</span><br><span>         leg = (struct sip_call_leg *) _leg;</span><br><span>  other_leg = call_leg_other(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!other_leg) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMNCC, LOGL_ERROR, "leg(%p) other leg gone!\n", leg);</span><br><span style="color: hsl(120, 100%, 40%);">+          sip_release_call(&leg->base);</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span>    char *sdp = sdp_create_file(leg, other_leg, sdp_sendrecv);</span><br><span>   nua_invite(leg->nua_handle,</span><br><span>                   NUTAG_MEDIA_ENABLE(0),</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/15079">change 15079</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-sip-connector/+/15079"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-sip-connector </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I947aab6c0cc5019929bde1c7012e1a8c3d3472a5 </div>
<div style="display:none"> Gerrit-Change-Number: 15079 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: keith <keith@rhizomatica.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>