<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12151">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gsm0408_test: test encoding and decoding Mobile Identity<br><br>One would think by now we would solidly encode and decode Mobile Identities.<br>Well, guess again.<br><br>- rc is sometimes the amount of bytes written, sometimes actual strlen().<br><br>- on string truncation, rc is sometimes strlen() (assuming truncation), and<br>  sometimes snprintf()-style would-be strlen().<br><br>- returned string, when truncated by not enough buffer size, is sometimes nul<br>  terminated, sometimes not.<br><br>- gsm48_mi_to_string() happily reads a byte from zero-length input buffer.<br><br>- gsm48_mi_to_string() happily writes to zero length output buffer.<br><br>- gsm48_mi_to_string() returns nonempty string for empty input.<br><br>- encoding a MI type that still has the GSM_MI_ODD flag set results in encoding<br>  an even-length MI as odd-length (hence appending a stray 'F').<br><br>I am going to tweak the implementation of gsm48 mobile identity encoding /<br>decoding, so first pinpoint the current behavior in a unit test, and show how<br>perforated even such a seemingly trivial API can be.<br><br>Change-Id: Iaae3af87f82f1a8f2e6273984c011b2813038cf7<br>---<br>M tests/gsm0408/gsm0408_test.c<br>M tests/gsm0408/gsm0408_test.ok<br>2 files changed, 358 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/51/12151/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c</span><br><span>index 2a0e661..d38969b 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.c</span><br><span>+++ b/tests/gsm0408/gsm0408_test.c</span><br><span>@@ -352,11 +352,246 @@</span><br><span>      printf("passed: [%u] %s\n", len, osmo_hexdump(buf, len));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct test_mid_encode_decode_test {</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t mi_type;</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *mi_str;</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t str_size;</span><br><span style="color: hsl(120, 100%, 40%);">+      const char *expect_mi_tlv_hex;</span><br><span style="color: hsl(120, 100%, 40%);">+        const char *expect_str;</span><br><span style="color: hsl(120, 100%, 40%);">+       int expect_rc;</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%);">+static const struct test_mid_encode_decode_test test_mid_encode_decode_tests[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      {</span><br><span style="color: hsl(120, 100%, 40%);">+             .mi_type = GSM_MI_TYPE_IMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "123456789012345",</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_mi_tlv_hex = "17081932547698103254",</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%);">+             .mi_type = GSM_MI_TYPE_IMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "12345678901234",</span><br><span style="color: hsl(120, 100%, 40%);">+         .expect_mi_tlv_hex = "170811325476981032f4",</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%);">+             .mi_type = GSM_MI_TYPE_IMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "423423",</span><br><span style="color: hsl(120, 100%, 40%);">+         .expect_mi_tlv_hex = "1704413224f3",</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%);">+             .mi_type = GSM_MI_TYPE_IMSI | GSM_MI_ODD,</span><br><span style="color: hsl(120, 100%, 40%);">+             .mi_str = "423423",</span><br><span style="color: hsl(120, 100%, 40%);">+         .expect_mi_tlv_hex = "1704493224f3", /* encodes "odd" for even number of digits! */</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%);">+             .mi_type = GSM_MI_TYPE_IMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "4234235",</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_mi_tlv_hex = "170449322453",</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%);">+             .mi_type = GSM_MI_TYPE_IMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "4234235",</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_mi_tlv_hex = "170449322453",</span><br><span style="color: hsl(120, 100%, 40%);">+                .str_size = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_str = "423",</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_rc = 3, /* exception: on truncation, gsm48_mi_to_string() returns strlen(), not bytes! */</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%);">+             .mi_type = GSM_MI_TYPE_IMEI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "123456789012345",</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_mi_tlv_hex = "17081a32547698103254",</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%);">+             .mi_type = GSM_MI_TYPE_IMEI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "98765432109876",</span><br><span style="color: hsl(120, 100%, 40%);">+         .expect_mi_tlv_hex = "170892785634129078f6",</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%);">+             .mi_type = GSM_MI_TYPE_IMEI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "987654321098765",</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_mi_tlv_hex = "17089a78563412907856",</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%);">+             .mi_type = GSM_MI_TYPE_IMEISV,</span><br><span style="color: hsl(120, 100%, 40%);">+                .mi_str = "987654321098765432",</span><br><span style="color: hsl(120, 100%, 40%);">+             .expect_mi_tlv_hex = "170a937856341290785634f2",</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%);">+             .mi_type = GSM_MI_TYPE_IMEISV,</span><br><span style="color: hsl(120, 100%, 40%);">+                .mi_str = "987654321098765432",</span><br><span style="color: hsl(120, 100%, 40%);">+             .expect_mi_tlv_hex = "170a937856341290785634f2",</span><br><span style="color: hsl(120, 100%, 40%);">+            .str_size = 16,</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_str = "987654321098765",</span><br><span style="color: hsl(120, 100%, 40%);">+            .expect_rc = 15, /* exception: on truncation, gsm48_mi_to_string() returns strlen(), not bytes! */</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%);">+             /* gsm48 treats TMSI as decimal string */</span><br><span style="color: hsl(120, 100%, 40%);">+             .mi_type = GSM_MI_TYPE_TMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "305419896", /* 0x12345678 as decimal */</span><br><span style="color: hsl(120, 100%, 40%);">+          .expect_mi_tlv_hex = "1705f412345678",</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_rc = 9, /* exception: gsm48_mi_to_string() for TMSI returns strlen(), not bytes! */</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%);">+             .mi_type = GSM_MI_TYPE_TMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "12648430", /* 0xc0ffee as decimal */</span><br><span style="color: hsl(120, 100%, 40%);">+             .expect_mi_tlv_hex = "1705f400c0ffee",</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_rc = 8, /* exception: gsm48_mi_to_string() for TMSI returns strlen(), not bytes! */</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%);">+             .mi_type = GSM_MI_TYPE_TMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "0",</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_mi_tlv_hex = "1705f400000000",</span><br><span style="color: hsl(120, 100%, 40%);">+              .expect_rc = 1, /* exception: gsm48_mi_to_string() for TMSI returns strlen(), not bytes! */</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%);">+             /* gsm48 treats TMSI as decimal string */</span><br><span style="color: hsl(120, 100%, 40%);">+             .mi_type = GSM_MI_TYPE_TMSI,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "305419896", /* 0x12345678 as decimal */</span><br><span style="color: hsl(120, 100%, 40%);">+          .expect_mi_tlv_hex = "1705f412345678",</span><br><span style="color: hsl(120, 100%, 40%);">+              .str_size = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_str = "3054",</span><br><span style="color: hsl(120, 100%, 40%);">+               .expect_rc = 9, /* exception: gsm48_mi_to_string() for TMSI returns would-be strlen() like snprintf()! */</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%);">+             .mi_type = GSM_MI_TYPE_NONE,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "123",</span><br><span style="color: hsl(120, 100%, 40%);">+            .expect_mi_tlv_hex = "17021832", /* encoding nonsense! */</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_str = "",</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%);">+             .mi_type = GSM_MI_TYPE_NONE,</span><br><span style="color: hsl(120, 100%, 40%);">+          .mi_str = "1234",</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_mi_tlv_hex = "17031032f4", /* encoding nonsense! */</span><br><span style="color: hsl(120, 100%, 40%);">+         .expect_str = "",</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%);">+             .mi_type = GSM_MI_ODD,</span><br><span style="color: hsl(120, 100%, 40%);">+                .mi_str = "1234",</span><br><span style="color: hsl(120, 100%, 40%);">+           .expect_mi_tlv_hex = "17031832f4", /* encoding nonsense and encodes "odd" for an even number of digits! */</span><br><span style="color: hsl(120, 100%, 40%);">+                .expect_str = "",</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_mid_encode_decode(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      printf("\nTesting Mobile Identity conversions\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (i = 0; i < ARRAY_SIZE(test_mid_encode_decode_tests); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           const struct test_mid_encode_decode_test *t = &test_mid_encode_decode_tests[i];</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t tlv_buf[64];</span><br><span style="color: hsl(120, 100%, 40%);">+          uint8_t *mi_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+              int tlv_len;</span><br><span style="color: hsl(120, 100%, 40%);">+          int mi_len;</span><br><span style="color: hsl(120, 100%, 40%);">+           const char *tlv_hex;</span><br><span style="color: hsl(120, 100%, 40%);">+          char str[64] = {};</span><br><span style="color: hsl(120, 100%, 40%);">+            size_t str_size = t->str_size ? : sizeof(str);</span><br><span style="color: hsl(120, 100%, 40%);">+             const char *expect_str = t->expect_str ? : t->mi_str;</span><br><span style="color: hsl(120, 100%, 40%);">+           int expect_rc = t->expect_rc ? : strlen(expect_str)+1;</span><br><span style="color: hsl(120, 100%, 40%);">+             int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+               int str_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("- %s %s\n", gsm48_mi_type_name(t->mi_type), t->mi_str);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (t->mi_type == GSM_MI_TYPE_TMSI)</span><br><span style="color: hsl(120, 100%, 40%);">+                        tlv_len = gsm48_generate_mid_from_tmsi(tlv_buf, (uint32_t)atoll(t->mi_str));</span><br><span style="color: hsl(120, 100%, 40%);">+               else</span><br><span style="color: hsl(120, 100%, 40%);">+                  tlv_len = gsm48_generate_mid(tlv_buf, t->mi_str, t->mi_type);</span><br><span style="color: hsl(120, 100%, 40%);">+           tlv_hex = osmo_hexdump_nospc(tlv_buf, tlv_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("  -> MI-TLV-hex='%s'\n", tlv_hex);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (t->expect_mi_tlv_hex && strcmp(tlv_hex, t->expect_mi_tlv_hex)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("     ERROR: expected '%s'\n", t->expect_mi_tlv_hex);</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%);">+           /* skip the GSM48_IE_MOBILE_ID tag and length */</span><br><span style="color: hsl(120, 100%, 40%);">+              mi_buf = tlv_buf + 2;</span><br><span style="color: hsl(120, 100%, 40%);">+         mi_len = tlv_len - 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = gsm48_mi_to_string(str, str_size, mi_buf, mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+               printf("  -> MI-str=%s rc=%d\n", osmo_quote_str(str, -1), rc);</span><br><span style="color: hsl(120, 100%, 40%);">+           if (strcmp(str, expect_str))</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf("     ERROR: expected MI-str=%s\n", osmo_quote_str(expect_str, -1));</span><br><span style="color: hsl(120, 100%, 40%);">+         if (rc != expect_rc)</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf("     ERROR: expected rc=%d\n", expect_rc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Now make sure the resulting string is always '\0' terminated.</span><br><span style="color: hsl(120, 100%, 40%);">+               * The above started out with a zeroed buffer, now repeat with a tainted one. */</span><br><span style="color: hsl(120, 100%, 40%);">+              str_len = strlen(str);</span><br><span style="color: hsl(120, 100%, 40%);">+                str[str_len] = '!';</span><br><span style="color: hsl(120, 100%, 40%);">+           gsm48_mi_to_string(str, str_size, mi_buf, mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (strlen(str) != str_len)</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("     ERROR: resulting string is not explicitly nul terminated\n");</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const uint8_t test_mid_decode_zero_length_types[] = { GSM_MI_TYPE_IMSI, GSM_MI_TYPE_TMSI, GSM_MI_TYPE_NONE };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_mid_decode_zero_length(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      int odd;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t valid_mi[64];</span><br><span style="color: hsl(120, 100%, 40%);">+ int valid_mi_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   printf("\nDecoding zero length Mobile Identities\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* IMSI = 123456789012345 */</span><br><span style="color: hsl(120, 100%, 40%);">+  valid_mi_len = osmo_hexparse("1932547698103254", valid_mi, sizeof(valid_mi));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (odd = 0; odd <= 1; odd++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int i;</span><br><span style="color: hsl(120, 100%, 40%);">+                for (i = 0; i < ARRAY_SIZE(test_mid_decode_zero_length_types); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      uint8_t mi_type = test_mid_decode_zero_length_types[i] | (odd ? GSM_MI_ODD : 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      char str[8] = {};</span><br><span style="color: hsl(120, 100%, 40%);">+                     int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     printf("- MI type: %s%s\n", gsm48_mi_type_name(mi_type & GSM_MI_TYPE_MASK),</span><br><span style="color: hsl(120, 100%, 40%);">+                            odd ? " | GSM_MI_ODD":"");</span><br><span style="color: hsl(120, 100%, 40%);">+                 valid_mi[0] = (valid_mi[0] & 0xf0) | mi_type;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("  - writing to zero-length string:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                     memset(str, '!', sizeof(str) - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc = gsm48_mi_to_string(str, 0, valid_mi, valid_mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                      printf("    rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (str[0] == '!')</span><br><span style="color: hsl(120, 100%, 40%);">+                            printf("    nothing written\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                    else</span><br><span style="color: hsl(120, 100%, 40%);">+                          printf("    ERROR: Wrote to invalid memory!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf("  - writing to 1-byte-length string:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                   memset(str, '!', sizeof(str) - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc = gsm48_mi_to_string(str, 1, valid_mi, valid_mi_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                      printf("    rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (str[0] == '\0')</span><br><span style="color: hsl(120, 100%, 40%);">+                           printf("    returned empty string\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      else if (str[0] == '!')</span><br><span style="color: hsl(120, 100%, 40%);">+                               printf("    ERROR: nothing written, expected nul-terminated empty string\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                       else</span><br><span style="color: hsl(120, 100%, 40%);">+                          printf("    ERROR: Wrote unexpected string %s\n", osmo_quote_str(str, 5));</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (str[1] != '!')</span><br><span style="color: hsl(120, 100%, 40%);">+                            printf("    ERROR: Wrote to invalid memory!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf("  - decode zero-length mi:\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                     memset(str, '!', sizeof(str) - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc = gsm48_mi_to_string(str, sizeof(str), valid_mi, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                       printf("    rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (str[0] == '\0')</span><br><span style="color: hsl(120, 100%, 40%);">+                           printf("    returned empty string\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                      else if (str[0] == '!')</span><br><span style="color: hsl(120, 100%, 40%);">+                               printf("    ERROR: nothing written, expected nul-terminated empty string\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                       else</span><br><span style="color: hsl(120, 100%, 40%);">+                          printf("    ERROR: expected empty string, got output string: %s\n", osmo_quote_str(str, -1));</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%);">+     printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>         test_bearer_cap();</span><br><span>   test_mid_from_tmsi();</span><br><span>        test_mid_from_imsi();</span><br><span style="color: hsl(120, 100%, 40%);">+ test_mid_encode_decode();</span><br><span style="color: hsl(120, 100%, 40%);">+     test_mid_decode_zero_length();</span><br><span>       test_ra_cap();</span><br><span>       test_lai_encode_decode();</span><br><span> </span><br><span>diff --git a/tests/gsm0408/gsm0408_test.ok b/tests/gsm0408/gsm0408_test.ok</span><br><span>index c1d6a70..1dc4249 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.ok</span><br><span>+++ b/tests/gsm0408/gsm0408_test.ok</span><br><span>@@ -2,6 +2,129 @@</span><br><span> Test `Speech, all codecs' passed</span><br><span> Simple TMSI encoding test....passed</span><br><span> Simple IMSI encoding test....passed: [10] 17 08 99 10 07 00 00 00 64 02 </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Testing Mobile Identity conversions</span><br><span style="color: hsl(120, 100%, 40%);">+- IMSI 123456789012345</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='17081932547698103254'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="123456789012345" rc=16</span><br><span style="color: hsl(120, 100%, 40%);">+- IMSI 12345678901234</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='170811325476981032f4'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="12345678901234" rc=15</span><br><span style="color: hsl(120, 100%, 40%);">+- IMSI 423423</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='1704413224f3'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="423423" rc=7</span><br><span style="color: hsl(120, 100%, 40%);">+- unknown 0x9 423423</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='1704493224f3'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="423423F" rc=8</span><br><span style="color: hsl(120, 100%, 40%);">+     ERROR: expected MI-str="423423"</span><br><span style="color: hsl(120, 100%, 40%);">+     ERROR: expected rc=7</span><br><span style="color: hsl(120, 100%, 40%);">+- IMSI 4234235</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='170449322453'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="4234235" rc=8</span><br><span style="color: hsl(120, 100%, 40%);">+- IMSI 4234235</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='170449322453'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="423" rc=3</span><br><span style="color: hsl(120, 100%, 40%);">+     ERROR: resulting string is not explicitly nul terminated</span><br><span style="color: hsl(120, 100%, 40%);">+- IMEI 123456789012345</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='17081a32547698103254'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="123456789012345" rc=16</span><br><span style="color: hsl(120, 100%, 40%);">+- IMEI 98765432109876</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='170892785634129078f6'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="98765432109876" rc=15</span><br><span style="color: hsl(120, 100%, 40%);">+- IMEI 987654321098765</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='17089a78563412907856'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="987654321098765" rc=16</span><br><span style="color: hsl(120, 100%, 40%);">+- IMEI-SV 987654321098765432</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='170a937856341290785634f2'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="987654321098765432" rc=19</span><br><span style="color: hsl(120, 100%, 40%);">+- IMEI-SV 987654321098765432</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='170a937856341290785634f2'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="987654321098765" rc=15</span><br><span style="color: hsl(120, 100%, 40%);">+     ERROR: resulting string is not explicitly nul terminated</span><br><span style="color: hsl(120, 100%, 40%);">+- TMSI 305419896</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='1705f412345678'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="305419896" rc=9</span><br><span style="color: hsl(120, 100%, 40%);">+- TMSI 12648430</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='1705f400c0ffee'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="12648430" rc=8</span><br><span style="color: hsl(120, 100%, 40%);">+- TMSI 0</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='1705f400000000'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="0" rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+- TMSI 305419896</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='1705f412345678'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="3054" rc=9</span><br><span style="color: hsl(120, 100%, 40%);">+- NONE 123</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='17021832'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="" rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+- NONE 1234</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='17031032f4'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="" rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+- unknown 0x8 1234</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-TLV-hex='17031832f4'</span><br><span style="color: hsl(120, 100%, 40%);">+  -> MI-str="" rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Decoding zero length Mobile Identities</span><br><span style="color: hsl(120, 100%, 40%);">+- MI type: IMSI</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to zero-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: Wrote to invalid memory!</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to 1-byte-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: Wrote unexpected string "1!!!!"</span><br><span style="color: hsl(120, 100%, 40%);">+  - decode zero-length mi:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=2</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: expected empty string, got output string: "1"</span><br><span style="color: hsl(120, 100%, 40%);">+- MI type: TMSI</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to zero-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: Wrote to invalid memory!</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to 1-byte-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    returned empty string</span><br><span style="color: hsl(120, 100%, 40%);">+  - decode zero-length mi:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    returned empty string</span><br><span style="color: hsl(120, 100%, 40%);">+- MI type: NONE</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to zero-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: Wrote to invalid memory!</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to 1-byte-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    returned empty string</span><br><span style="color: hsl(120, 100%, 40%);">+  - decode zero-length mi:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    returned empty string</span><br><span style="color: hsl(120, 100%, 40%);">+- MI type: IMSI | GSM_MI_ODD</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to zero-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: Wrote to invalid memory!</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to 1-byte-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: Wrote unexpected string "1!!!!"</span><br><span style="color: hsl(120, 100%, 40%);">+  - decode zero-length mi:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=2</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: expected empty string, got output string: "1"</span><br><span style="color: hsl(120, 100%, 40%);">+- MI type: TMSI | GSM_MI_ODD</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to zero-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: Wrote to invalid memory!</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to 1-byte-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    returned empty string</span><br><span style="color: hsl(120, 100%, 40%);">+  - decode zero-length mi:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    returned empty string</span><br><span style="color: hsl(120, 100%, 40%);">+- MI type: NONE | GSM_MI_ODD</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to zero-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    ERROR: Wrote to invalid memory!</span><br><span style="color: hsl(120, 100%, 40%);">+  - writing to 1-byte-length string:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    returned empty string</span><br><span style="color: hsl(120, 100%, 40%);">+  - decode zero-length mi:</span><br><span style="color: hsl(120, 100%, 40%);">+    rc=1</span><br><span style="color: hsl(120, 100%, 40%);">+    returned empty string</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> Constructed RA:</span><br><span> 077-121-666-5</span><br><span> MCC+MNC in BCD: 70 17 21 </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12151">change 12151</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/12151"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Iaae3af87f82f1a8f2e6273984c011b2813038cf7 </div>
<div style="display:none"> Gerrit-Change-Number: 12151 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>