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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libmsc/db.c: introduce and use parse_sm_ud_from_result()<br><br>The following functions:<br><br>  - sms_from_result(),<br>  - sms_from_result_v3(),<br>  - sms_from_result_v4(),<br><br>do retrieve the TP-UD, TP-UDL and text in the same way.<br><br>A consequence of such duplication is [1], which fixed potential<br>NULL-pointer dereference for sms_from_result(), but not for two<br>other functions: sms_from_result_v3() and sms_from_result_v4().<br><br>[1] I545967464c406348b8505d1729213cfb4afcd3e2<br><br>Change-Id: If67dfb9f7d2a55fa3d45dc4689a2acff9909faf6<br>---<br>M src/libmsc/db.c<br>1 file changed, 37 insertions(+), 49 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libmsc/db.c b/src/libmsc/db.c</span><br><span>index 1fe8e6b..a12889b 100644</span><br><span>--- a/src/libmsc/db.c</span><br><span>+++ b/src/libmsc/db.c</span><br><span>@@ -225,6 +225,34 @@</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void parse_tp_ud_from_result(struct gsm_sms *sms, dbi_result result)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    const unsigned char *user_data;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int user_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *text;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Retrieve TP-UDL (User-Data-Length) in octets (regardless of DCS) */</span><br><span style="color: hsl(120, 100%, 40%);">+        user_data_len = dbi_result_get_field_length(result, "user_data");</span><br><span style="color: hsl(120, 100%, 40%);">+   if (user_data_len > sizeof(sms->user_data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DDB, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+              "SMS TP-UD length %u is too big, truncating to %zu\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              user_data_len, sizeof(sms->user_data));</span><br><span style="color: hsl(120, 100%, 40%);">+               user_data_len = (uint8_t) sizeof(sms->user_data);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+     sms->user_data_len = user_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Retrieve the TP-UD (User-Data) itself */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (user_data_len > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           user_data = dbi_result_get_binary(result, "user_data");</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(sms->user_data, user_data, user_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Retrieve the text parsed from TP-UD (User-Data) */</span><br><span style="color: hsl(120, 100%, 40%);">+ text = dbi_result_get_string(result, "text");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (text)</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_STRLCPY_ARRAY(sms->text, text);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /**</span><br><span>  * Copied from the normal sms_from_result_v3 to avoid having</span><br><span>  * to make sure that the real routine will remain backward</span><br><span>@@ -234,9 +262,7 @@</span><br><span> {</span><br><span>         struct gsm_sms *sms = sms_alloc();</span><br><span>   long long unsigned int sender_id;</span><br><span style="color: hsl(0, 100%, 40%);">-       const char *text, *daddr;</span><br><span style="color: hsl(0, 100%, 40%);">-       const unsigned char *user_data;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int user_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *daddr;</span><br><span>   char buf[32];</span><br><span>        char *quoted;</span><br><span>        dbi_result result2;</span><br><span>@@ -274,20 +300,9 @@</span><br><span>   if (daddr)</span><br><span>           OSMO_STRLCPY_ARRAY(sms->dst.addr, daddr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        user_data_len = dbi_result_get_field_length(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-     user_data = dbi_result_get_binary(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-       if (user_data_len > sizeof(sms->user_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DDB, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                "SMS TP-UD length %u is too big, truncating to %zu\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                user_data_len, sizeof(sms->user_data));</span><br><span style="color: hsl(0, 100%, 40%);">-         user_data_len = (uint8_t) sizeof(sms->user_data);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       sms->user_data_len = user_data_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(sms->user_data, user_data, sms->user_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Parse TP-UD, TP-UDL and decoded text */</span><br><span style="color: hsl(120, 100%, 40%);">+    parse_tp_ud_from_result(sms, result);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       text = dbi_result_get_string(result, "text");</span><br><span style="color: hsl(0, 100%, 40%);">- if (text)</span><br><span style="color: hsl(0, 100%, 40%);">-               OSMO_STRLCPY_ARRAY(sms->text, text);</span><br><span>      return sms;</span><br><span> }</span><br><span> </span><br><span>@@ -400,9 +415,7 @@</span><br><span> static struct gsm_sms *sms_from_result_v4(dbi_result result)</span><br><span> {</span><br><span>      struct gsm_sms *sms = sms_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-      const unsigned char *user_data;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int user_data_len;</span><br><span style="color: hsl(0, 100%, 40%);">-     const char *text, *addr;</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *addr;</span><br><span> </span><br><span>        if (!sms)</span><br><span>            return NULL;</span><br><span>@@ -426,20 +439,9 @@</span><br><span>  sms->dst.ton = dbi_result_get_ulonglong(result, "dest_ton");</span><br><span>    sms->dst.npi = dbi_result_get_ulonglong(result, "dest_npi");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   user_data_len = dbi_result_get_field_length(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-     user_data = dbi_result_get_binary(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-       if (user_data_len > sizeof(sms->user_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DDB, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                "SMS TP-UD length %u is too big, truncating to %zu\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                user_data_len, sizeof(sms->user_data));</span><br><span style="color: hsl(0, 100%, 40%);">-         user_data_len = (uint8_t) sizeof(sms->user_data);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       sms->user_data_len = user_data_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  memcpy(sms->user_data, user_data, sms->user_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Parse TP-UD, TP-UDL and decoded text */</span><br><span style="color: hsl(120, 100%, 40%);">+    parse_tp_ud_from_result(sms, result);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       text = dbi_result_get_string(result, "text");</span><br><span style="color: hsl(0, 100%, 40%);">- if (text)</span><br><span style="color: hsl(0, 100%, 40%);">-               OSMO_STRLCPY_ARRAY(sms->text, text);</span><br><span>      return sms;</span><br><span> }</span><br><span> </span><br><span>@@ -763,9 +765,7 @@</span><br><span> static struct gsm_sms *sms_from_result(struct gsm_network *net, dbi_result result)</span><br><span> {</span><br><span>        struct gsm_sms *sms = sms_alloc();</span><br><span style="color: hsl(0, 100%, 40%);">-      const char *text, *daddr, *saddr;</span><br><span style="color: hsl(0, 100%, 40%);">-       const unsigned char *user_data;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int user_data_len;</span><br><span style="color: hsl(120, 100%, 40%);">+   const char *daddr, *saddr;</span><br><span>   time_t validity_timestamp;</span><br><span> </span><br><span>       if (!sms)</span><br><span>@@ -802,21 +802,9 @@</span><br><span>     if (saddr)</span><br><span>           OSMO_STRLCPY_ARRAY(sms->src.addr, saddr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        user_data_len = dbi_result_get_field_length(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-     user_data = dbi_result_get_binary(result, "user_data");</span><br><span style="color: hsl(0, 100%, 40%);">-       if (user_data_len > sizeof(sms->user_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DDB, LOGL_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-                "SMS TP-UD length %u is too big, truncating to %zu\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                user_data_len, sizeof(sms->user_data));</span><br><span style="color: hsl(0, 100%, 40%);">-         user_data_len = (uint8_t) sizeof(sms->user_data);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(0, 100%, 40%);">-       sms->user_data_len = user_data_len;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (user_data)</span><br><span style="color: hsl(0, 100%, 40%);">-          memcpy(sms->user_data, user_data, sms->user_data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Parse TP-UD, TP-UDL and decoded text */</span><br><span style="color: hsl(120, 100%, 40%);">+    parse_tp_ud_from_result(sms, result);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       text = dbi_result_get_string(result, "text");</span><br><span style="color: hsl(0, 100%, 40%);">- if (text)</span><br><span style="color: hsl(0, 100%, 40%);">-               OSMO_STRLCPY_ARRAY(sms->text, text);</span><br><span>      return sms;</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-msc/+/13488">change 13488</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-msc/+/13488"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: If67dfb9f7d2a55fa3d45dc4689a2acff9909faf6 </div>
<div style="display:none"> Gerrit-Change-Number: 13488 </div>
<div style="display:none"> Gerrit-PatchSet: 8 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>