summaryrefslogtreecommitdiffstats
path: root/tests/gsm0808/gsm0808_test.c
diff options
context:
space:
mode:
authorStefan Sperling <ssperling@sysmocom.de>2018-03-15 18:05:02 +0100
committerStefan Sperling <ssperling@sysmocom.de>2018-03-15 18:27:30 +0100
commite1a86748a2c7f6154644deee0477f629a86ca8ec (patch)
tree30a68874708b27619b06a3e088a3bf584dc217b4 /tests/gsm0808/gsm0808_test.c
parent2873bf1f331dc07e6c92b4f6a0b45f26683a0f0b (diff)
fix cell identifier decoding in libosmocore
The cell ID list decoder merged in 11a4d9dd91216fe353e94bfdbbab53bc4f891c0d has a bug which was introduced part-way through the review process in gerrit at https://gerrit.osmocom.org/#/c/6509/ When Neels suggested "why not just {...}id_list[MAXLEN] once?" I changed the cell identifier list from a union of arrays to an array of unions. After this change, elements smaller than the largest type in the union were not laid out consecutively in memory anymore. E.g. uint16_t lac values now occur at offsets of sizeof(id_list[0]) instead of offsets of sizeof(uint16_t). The problem is that I forgot to adjust the decoder accordingly, so the decoder writes to the wrong offsets and returns cell identifier lists which appear to contain uninitialized values when read back by API consumers. I found this problem while adding new regression tests to libosmocore to test encoding and decoding. This commit adds one such tests for LAC list decoding, which failed due to the above bug. I plan to write more tests, however because this first test already uncovered a severe issue I chose to submit a fix now and work on additional tests in later commits. Change-Id: Ie1a5a9d858226be578cf11a03cf996d509bd51fb Related: OS#2847
Diffstat (limited to 'tests/gsm0808/gsm0808_test.c')
-rw-r--r--tests/gsm0808/gsm0808_test.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c
index 21a0c992..8e21b0cb 100644
--- a/tests/gsm0808/gsm0808_test.c
+++ b/tests/gsm0808/gsm0808_test.c
@@ -805,6 +805,42 @@ static void test_gsm0808_enc_dec_cell_id_list_single_lac()
msgb_free(msg);
}
+static void test_gsm0808_enc_dec_cell_id_list_multi_lac()
+{
+ struct gsm0808_cell_id_list2 enc_cil;
+ struct gsm0808_cell_id_list2 dec_cil;
+ struct msgb *msg;
+ uint8_t cil_enc_expected[] = { GSM0808_IE_CELL_IDENTIFIER_LIST, 0x0b, 0x05,
+ 0x23, 0x42,
+ 0x24, 0x43,
+ 0x25, 0x44,
+ 0x26, 0x45,
+ 0x27, 0x46
+ };
+ uint8_t rc_enc;
+ int rc_dec;
+
+ memset(&enc_cil, 0, sizeof(enc_cil));
+ enc_cil.id_discr = CELL_IDENT_LAC;
+ enc_cil.id_list[0].lac = 0x2342;
+ enc_cil.id_list[1].lac = 0x2443;
+ enc_cil.id_list[2].lac = 0x2544;
+ enc_cil.id_list[3].lac = 0x2645;
+ enc_cil.id_list[4].lac = 0x2746;
+ enc_cil.id_list_len = 5;
+
+ msg = msgb_alloc(1024, "output buffer");
+ rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
+ OSMO_ASSERT(rc_enc == sizeof(cil_enc_expected));
+ OSMO_ASSERT(memcmp(cil_enc_expected, msg->data, msg->len) == 0);
+
+ rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
+ OSMO_ASSERT(rc_dec == msg->len - 2);
+ OSMO_ASSERT(memcmp(&enc_cil, &dec_cil, sizeof(enc_cil)) == 0);
+
+ msgb_free(msg);
+}
+
static void test_gsm0808_enc_dec_cell_id_list_bss()
{
struct gsm0808_cell_id_list2 enc_cil;
@@ -861,6 +897,7 @@ int main(int argc, char **argv)
test_gsm0808_enc_dec_encrypt_info();
test_gsm0808_enc_dec_cell_id_list_lac();
test_gsm0808_enc_dec_cell_id_list_single_lac();
+ test_gsm0808_enc_dec_cell_id_list_multi_lac();
test_gsm0808_enc_dec_cell_id_list_bss();
printf("Done\n");