fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/22542 )
Change subject: gsm_7bit_encode_n(): test encoding of more than 250 septets ...................................................................... gsm_7bit_encode_n(): test encoding of more than 250 septets As can be seen, this unit test reveals problems with encoding of more than 250 septets using gsm_7bit_encode_n(). The problem is that some API functions use type 'uint8_t' for the length, so we basically suffer from integer overflows. Change-Id: I723300578d5ab0c7b94cf49c14d962b2dbf47740 --- M tests/sms/sms_test.c M tests/sms/sms_test.ok 2 files changed, 70 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/42/22542/1 diff --git a/tests/sms/sms_test.c b/tests/sms/sms_test.c index 0615396..c7f47e2 100644 --- a/tests/sms/sms_test.c +++ b/tests/sms/sms_test.c @@ -268,6 +268,54 @@ printf("Result: len(%d) data(%s)\n", len, osmo_hexdump(oa, len)); } +static void test_enc_large_msg(void) +{ + uint8_t enc_buf[2048 * 7 / 8]; + char large_msg[2048 + 1]; + int i, j, nsep, noct = 0; + + printf("\nRunning %s\n", __func__); + + /* Expected chunks (repeated) in the output buffer */ + const uint8_t exp_chunk[] = { 0xc1, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x83 }; + + /* Length variants to be tested */ + static const size_t nlen[] = { 2048, 1024, 555, 512, 260, 255, 250 }; + + memset(&large_msg[0], (int) 'A', sizeof(large_msg) - 1); + + for (i = 0; i < ARRAY_SIZE(nlen); i++) { + /* Clear the output buffer first */ + memset(&enc_buf[0], 0x00, sizeof(enc_buf)); + /* Limit length of the input string */ + large_msg[nlen[i]] = '\0'; + + /* How many octets we expect to be used? */ + int noct_exp = nlen[i] * 7 / 8; + if (nlen[i] % 8 != 0) + noct_exp++; + + /* Encode a sequence of 'A' repeated nlen[i] times */ + nsep = gsm_7bit_encode_n(&enc_buf[0], sizeof(enc_buf), large_msg, &noct); + printf("gsm_7bit_encode_n(len=%zu) processed %d septets (expected %zu): %s\n", + nlen[i], nsep, nlen[i], nsep == nlen[i] ? "OK" : "FAIL"); + printf("gsm_7bit_encode_n(len=%zu) used %d octets in the buffer (expected %d): %s\n", + nlen[i], noct, noct_exp, noct == noct_exp ? "OK" : "FAIL"); + + /* The encoding result is expected to consist of repeated chunks */ + for (j = 0; j < noct_exp; j += sizeof(exp_chunk)) { + size_t len = OSMO_MIN(noct_exp - j, sizeof(exp_chunk)); + if (nlen[i] % 8 != 0) /* skip incomplete octets */ + len--; + if (memcmp(&enc_buf[j], exp_chunk, len) != 0) { + printf("\tUnexpected chunk at enc_buf[%d:%zu]: %s\n", + j, len, osmo_hexdump(&enc_buf[j], len)); + break; /* No need to show them all */ + } + } + } +} + int main(int argc, char** argv) { printf("SMS testing\n"); @@ -396,6 +444,7 @@ test_octet_return(); test_gen_oa(); + test_enc_large_msg(); printf("OK\n"); return 0; diff --git a/tests/sms/sms_test.ok b/tests/sms/sms_test.ok index a71567d..724c166 100644 --- a/tests/sms/sms_test.ok +++ b/tests/sms/sms_test.ok @@ -18,4 +18,25 @@ Result: len(2) data(00 91 ) Result: len(9) data(0e d0 4f 78 d9 2d 9c 0e 01 ) Result: len(12) data(14 d0 4f 78 d9 2d 9c 0e c3 e2 31 19 ) + +Running test_enc_large_msg +gsm_7bit_encode_n(len=2048) processed 2048 septets (expected 2048): OK +gsm_7bit_encode_n(len=2048) used 0 octets in the buffer (expected 1792): FAIL + Unexpected chunk at enc_buf[0:7]: 00 00 00 00 00 00 00 +gsm_7bit_encode_n(len=1024) processed 1024 septets (expected 1024): OK +gsm_7bit_encode_n(len=1024) used 0 octets in the buffer (expected 896): FAIL + Unexpected chunk at enc_buf[0:7]: 00 00 00 00 00 00 00 +gsm_7bit_encode_n(len=555) processed 555 septets (expected 555): OK +gsm_7bit_encode_n(len=555) used 38 octets in the buffer (expected 486): FAIL + Unexpected chunk at enc_buf[35:6]: c1 60 10 00 00 00 +gsm_7bit_encode_n(len=512) processed 512 septets (expected 512): OK +gsm_7bit_encode_n(len=512) used 0 octets in the buffer (expected 448): FAIL + Unexpected chunk at enc_buf[0:7]: 00 00 00 00 00 00 00 +gsm_7bit_encode_n(len=260) processed 260 septets (expected 260): OK +gsm_7bit_encode_n(len=260) used 4 octets in the buffer (expected 228): FAIL + Unexpected chunk at enc_buf[0:6]: c1 60 30 08 00 00 +gsm_7bit_encode_n(len=255) processed 255 septets (expected 255): OK +gsm_7bit_encode_n(len=255) used 224 octets in the buffer (expected 224): OK +gsm_7bit_encode_n(len=250) processed 250 septets (expected 250): OK +gsm_7bit_encode_n(len=250) used 219 octets in the buffer (expected 219): OK OK -- To view, visit https://gerrit.osmocom.org/c/libosmocore/+/22542 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: libosmocore Gerrit-Branch: master Gerrit-Change-Id: I723300578d5ab0c7b94cf49c14d962b2dbf47740 Gerrit-Change-Number: 22542 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanits...@sysmocom.de> Gerrit-MessageType: newchange