<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/14397">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  fixeria: Looks good to me, but someone else must approve
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gsm48_decode_bcd_number2: fix ENOSPC edge case<br><br>Return ENOSPC if the decoding buffer is one byte too small, instead of<br>returning 0 and silently truncating the string. Add a new "truncated"<br>variable to detect if the loop breaks in the final iteration.<br><br>The string is not truncated if there is exactly one 0xf ('\0') higher<br>nibble remaining. This is covered by the existing test case "long<br>15-digit (maximum) MSISDN, limited buffer".<br><br>Related: OS#4049<br>Change-Id: Ie05900aca50cc7fe8a45d17844dbfcd905fd82fe<br>---<br>M src/gsm/gsm48_ie.c<br>M tests/gsm0408/gsm0408_test.c<br>M tests/gsm0408/gsm0408_test.ok<br>3 files changed, 28 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gsm/gsm48_ie.c b/src/gsm/gsm48_ie.c</span><br><span>index 59f931b..31028ba 100644</span><br><span>--- a/src/gsm/gsm48_ie.c</span><br><span>+++ b/src/gsm/gsm48_ie.c</span><br><span>@@ -82,6 +82,7 @@</span><br><span> {</span><br><span>  uint8_t in_len;</span><br><span>      int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool truncated = false;</span><br><span>      if (output_len < 1)</span><br><span>               return -ENOSPC;</span><br><span>      *output = '\0';</span><br><span>@@ -94,14 +95,23 @@</span><br><span> </span><br><span>    for (i = 1 + h_len; i <= in_len; i++) {</span><br><span>           /* lower nibble */</span><br><span style="color: hsl(0, 100%, 40%);">-              if (output_len <= 1)</span><br><span style="color: hsl(120, 100%, 40%);">+               if (output_len <= 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     truncated = true;</span><br><span>                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>            *output++ = bcd_num_digits[bcd_lv[i] & 0xf];</span><br><span>             output_len--;</span><br><span> </span><br><span>            /* higher nibble */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (output_len <= 1)</span><br><span style="color: hsl(120, 100%, 40%);">+               if (output_len <= 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* not truncated if there is exactly one 0xf ('\0') higher nibble remaining */</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (i == in_len && (bcd_lv[i] & 0xf0) == 0xf0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          break;</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%);">+                   truncated = true;</span><br><span>                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>            *output++ = bcd_num_digits[bcd_lv[i] >> 4];</span><br><span>            output_len--;</span><br><span>        }</span><br><span>@@ -109,7 +119,7 @@</span><br><span>              *output++ = '\0';</span><br><span> </span><br><span>        /* Indicate whether the output was truncated */</span><br><span style="color: hsl(0, 100%, 40%);">- if (i < in_len)</span><br><span style="color: hsl(120, 100%, 40%);">+    if (truncated)</span><br><span>               return -ENOSPC;</span><br><span> </span><br><span>  return 0;</span><br><span>diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c</span><br><span>index b5f8061..db1d45a 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.c</span><br><span>+++ b/tests/gsm0408/gsm0408_test.c</span><br><span>@@ -727,6 +727,17 @@</span><br><span>                .dec_ascii = "(none)",</span><br><span>             .dec_rc = -EIO,</span><br><span>      },</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+             .test_name = "decoding buffer is one byte too small (OS#4049)",</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Decoding test */</span><br><span style="color: hsl(120, 100%, 40%);">+           .dec_hex   = "022143", /* "1234" */</span><br><span style="color: hsl(120, 100%, 40%);">+               .dec_ascii = "123",    /* '4' was truncated */</span><br><span style="color: hsl(120, 100%, 40%);">+              .dec_rc    = -ENOSPC,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Buffer length limitations */</span><br><span style="color: hsl(120, 100%, 40%);">+               .dec_buf_lim = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+     },</span><br><span> };</span><br><span> </span><br><span> static void test_bcd_number_encode_decode()</span><br><span>diff --git a/tests/gsm0408/gsm0408_test.ok b/tests/gsm0408/gsm0408_test.ok</span><br><span>index 844c201..d343869 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.ok</span><br><span>+++ b/tests/gsm0408/gsm0408_test.ok</span><br><span>@@ -186,6 +186,10 @@</span><br><span>   - Decoding HEX (buffer limit=0) ''...</span><br><span>     - Expected: (rc=-5) '(none)'</span><br><span>     -   Actual: (rc=-5) '(none)'</span><br><span style="color: hsl(120, 100%, 40%);">+- Running test: decoding buffer is one byte too small (OS#4049)</span><br><span style="color: hsl(120, 100%, 40%);">+  - Decoding HEX (buffer limit=4) '022143'...</span><br><span style="color: hsl(120, 100%, 40%);">+    - Expected: (rc=-28) '123'</span><br><span style="color: hsl(120, 100%, 40%);">+    -   Actual: (rc=-28) '123'</span><br><span> </span><br><span> Constructed RA:</span><br><span> 077-121-666-5</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/14397">change 14397</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/libosmocore/+/14397"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie05900aca50cc7fe8a45d17844dbfcd905fd82fe </div>
<div style="display:none"> Gerrit-Change-Number: 14397 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>