<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-hlr/+/21182">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">USSD: fix handle_ussd(): do not free() unconditionally<br><br>An internal handler may want to continue session, e.g. to request<br>more information from the MS.  Let's make the handlers responsible<br>for session state management, and check that state before calling<br>ss_session_free(), so a session can remain alive.<br><br>Before this patch ss->state was not set/used at all...<br><br>Change-Id: I49262e7fe26f29dedbf126087cfb8f3bb3c548dc<br>---<br>M src/hlr_ussd.c<br>1 file changed, 23 insertions(+), 16 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/hlr_ussd.c b/src/hlr_ussd.c</span><br><span>index 25e9354..399bdbc 100644</span><br><span>--- a/src/hlr_ussd.c</span><br><span>+++ b/src/hlr_ussd.c</span><br><span>@@ -279,19 +279,20 @@</span><br><span> }</span><br><span> </span><br><span> static int ss_tx_to_ms(struct ss_session *ss, enum osmo_gsup_message_type gsup_msg_type,</span><br><span style="color: hsl(0, 100%, 40%);">-                     bool final, struct msgb *ss_msg)</span><br><span style="color: hsl(120, 100%, 40%);">+                     struct msgb *ss_msg)</span><br><span> </span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osmo_gsup_message resp = {0};</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_gsup_message resp;</span><br><span>       int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     resp.message_type = gsup_msg_type;</span><br><span style="color: hsl(120, 100%, 40%);">+    resp = (struct osmo_gsup_message) {</span><br><span style="color: hsl(120, 100%, 40%);">+           .message_type = gsup_msg_type,</span><br><span style="color: hsl(120, 100%, 40%);">+                .session_id = ss->session_id,</span><br><span style="color: hsl(120, 100%, 40%);">+              .session_state = ss->state,</span><br><span style="color: hsl(120, 100%, 40%);">+        };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         OSMO_STRLCPY_ARRAY(resp.imsi, ss->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (final)</span><br><span style="color: hsl(0, 100%, 40%);">-              resp.session_state = OSMO_GSUP_SESSION_STATE_END;</span><br><span style="color: hsl(0, 100%, 40%);">-       else</span><br><span style="color: hsl(0, 100%, 40%);">-            resp.session_state = OSMO_GSUP_SESSION_STATE_CONTINUE;</span><br><span style="color: hsl(0, 100%, 40%);">-  resp.session_id = ss->session_id;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       if (ss_msg) {</span><br><span>                resp.ss_info = msgb_data(ss_msg);</span><br><span>            resp.ss_info_len = msgb_length(ss_msg);</span><br><span>@@ -311,7 +312,8 @@</span><br><span>        LOGPSS(ss, LOGL_NOTICE, "Tx Reject(%u, 0x%02x, 0x%02x)\n", invoke_id,</span><br><span>              problem_tag, problem_code);</span><br><span>  OSMO_ASSERT(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-       return ss_tx_to_ms(ss, OSMO_GSUP_MSGT_PROC_SS_RESULT, true, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+     ss->state = OSMO_GSUP_SESSION_STATE_END;</span><br><span style="color: hsl(120, 100%, 40%);">+   return ss_tx_to_ms(ss, OSMO_GSUP_MSGT_PROC_SS_RESULT, msg);</span><br><span> }</span><br><span> #endif</span><br><span> </span><br><span>@@ -320,15 +322,16 @@</span><br><span>       struct msgb *msg = gsm0480_gen_return_error(invoke_id, error_code);</span><br><span>  LOGPSS(ss, LOGL_NOTICE, "Tx ReturnError(%u, 0x%02x)\n", invoke_id, error_code);</span><br><span>    OSMO_ASSERT(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-       return ss_tx_to_ms(ss, OSMO_GSUP_MSGT_PROC_SS_RESULT, true, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+     ss->state = OSMO_GSUP_SESSION_STATE_END;</span><br><span style="color: hsl(120, 100%, 40%);">+   return ss_tx_to_ms(ss, OSMO_GSUP_MSGT_PROC_SS_RESULT, msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int ss_tx_to_ms_ussd_7bit(struct ss_session *ss, bool final, uint8_t invoke_id, const char *text)</span><br><span style="color: hsl(120, 100%, 40%);">+static int ss_tx_to_ms_ussd_7bit(struct ss_session *ss, uint8_t invoke_id, const char *text)</span><br><span> {</span><br><span>      struct msgb *msg = gsm0480_gen_ussd_resp_7bit(invoke_id, text);</span><br><span>      LOGPSS(ss, LOGL_INFO, "Tx USSD '%s'\n", text);</span><br><span>     OSMO_ASSERT(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-       return ss_tx_to_ms(ss, OSMO_GSUP_MSGT_PROC_SS_RESULT, final, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    return ss_tx_to_ms(ss, OSMO_GSUP_MSGT_PROC_SS_RESULT, msg);</span><br><span> }</span><br><span> </span><br><span> /***********************************************************************</span><br><span>@@ -344,6 +347,8 @@</span><br><span>       char buf[GSM0480_USSD_7BIT_STRING_LEN+1];</span><br><span>    int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   ss->state = OSMO_GSUP_SESSION_STATE_END;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        rc = db_subscr_get_by_imsi(g_hlr->dbc, ss->imsi, &subscr);</span><br><span>         switch (rc) {</span><br><span>        case 0:</span><br><span>@@ -351,7 +356,7 @@</span><br><span>                        snprintf(buf, sizeof(buf), "You have no MSISDN!");</span><br><span>                 else</span><br><span>                         snprintf(buf, sizeof(buf), "Your extension is %s", subscr.msisdn);</span><br><span style="color: hsl(0, 100%, 40%);">-            ss_tx_to_ms_ussd_7bit(ss, true, req->invoke_id, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+              ss_tx_to_ms_ussd_7bit(ss, req->invoke_id, buf);</span><br><span>           break;</span><br><span>       case -ENOENT:</span><br><span>                ss_tx_to_ms_error(ss, req->invoke_id, GSM0480_ERR_CODE_UNKNOWN_SUBSCRIBER);</span><br><span>@@ -369,7 +374,8 @@</span><br><span> {</span><br><span>    char buf[GSM0480_USSD_7BIT_STRING_LEN+1];</span><br><span>    snprintf(buf, sizeof(buf), "Your IMSI is %s", ss->imsi);</span><br><span style="color: hsl(0, 100%, 40%);">-   ss_tx_to_ms_ussd_7bit(ss, true, req->invoke_id, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+      ss->state = OSMO_GSUP_SESSION_STATE_END;</span><br><span style="color: hsl(120, 100%, 40%);">+   ss_tx_to_ms_ussd_7bit(ss, req->invoke_id, buf);</span><br><span>   return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -496,8 +502,9 @@</span><br><span>             } else {</span><br><span>                     /* Handle internally */</span><br><span>                      ss->u.iuse->handle_ussd(ss, gsup, req);</span><br><span style="color: hsl(0, 100%, 40%);">-                   /* Release session immediately */</span><br><span style="color: hsl(0, 100%, 40%);">-                       ss_session_free(ss);</span><br><span style="color: hsl(120, 100%, 40%);">+                  /* Release session if the handler has changed its state to END */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (ss->state == OSMO_GSUP_SESSION_STATE_END)</span><br><span style="color: hsl(120, 100%, 40%);">+                              ss_session_free(ss);</span><br><span>                 }</span><br><span>    }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-hlr/+/21182">change 21182</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-hlr/+/21182"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-hlr </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I49262e7fe26f29dedbf126087cfb8f3bb3c548dc </div>
<div style="display:none"> Gerrit-Change-Number: 21182 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>