This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Neels Hofmeyr gerrit-no-reply at lists.osmocom.orgNeels Hofmeyr has uploaded this change for review. ( https://gerrit.osmocom.org/12154
Change subject: gsm48_mi_to_string: use osmo_bcd2str(), fix some corner cases
......................................................................
gsm48_mi_to_string: use osmo_bcd2str(), fix some corner cases
By using osmo_bcd2str(), ensure that the resulting string is always nul
terminated, and always return strlen()+1 whether truncated or not.
Still keep up the previous return value style, even if that isn't consistent at
all.
The difference between IMSI/IMEI and TMSI return values remains and is not part
of this patch.
Change-Id: I1b51b72a721e1cc9d69796b804ebda741ff0f36b
---
M src/gsm/gsm48.c
M tests/gsm0408/gsm0408_test.c
M tests/gsm0408/gsm0408_test.ok
3 files changed, 22 insertions(+), 28 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/54/12154/1
diff --git a/src/gsm/gsm48.c b/src/gsm/gsm48.c
index e684a3c..df4b4c1 100644
--- a/src/gsm/gsm48.c
+++ b/src/gsm/gsm48.c
@@ -650,7 +650,7 @@
int gsm48_mi_to_string(char *string, const int str_len, const uint8_t *mi,
const int mi_len)
{
- int i;
+ int rc;
uint8_t mi_type;
char *str_cur = string;
uint32_t tmsi;
@@ -670,17 +670,15 @@
case GSM_MI_TYPE_IMSI:
case GSM_MI_TYPE_IMEI:
case GSM_MI_TYPE_IMEISV:
- *str_cur++ = osmo_bcd2char(mi[0] >> 4);
-
- for (i = 1; i < mi_len; i++) {
- if (str_cur + 2 >= string + str_len)
- return str_cur - string;
- *str_cur++ = osmo_bcd2char(mi[i] & 0xf);
- /* skip last nibble in last input byte when GSM_EVEN */
- if( (i != mi_len-1) || (mi[0] & GSM_MI_ODD))
- *str_cur++ = osmo_bcd2char(mi[i] >> 4);
- }
- break;
+ rc = osmo_bcd2str(string, str_len, mi,
+ 1, mi_len * 2 - ((mi[0] & GSM_MI_ODD) ? 0 : 1));
+ /* osmo_bcd2str() returns snprintf style strlen(), this returns bytes written. */
+ if (rc < str_len)
+ return rc + 1;
+ else if (!str_len)
+ return 0;
+ else
+ return strlen(string) + 1;
default:
break;
}
diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c
index d38969b..7dbb97d 100644
--- a/tests/gsm0408/gsm0408_test.c
+++ b/tests/gsm0408/gsm0408_test.c
@@ -393,7 +393,6 @@
.expect_mi_tlv_hex = "170449322453",
.str_size = 4,
.expect_str = "423",
- .expect_rc = 3, /* exception: on truncation, gsm48_mi_to_string() returns strlen(), not bytes! */
},
{
.mi_type = GSM_MI_TYPE_IMEI,
@@ -421,7 +420,6 @@
.expect_mi_tlv_hex = "170a937856341290785634f2",
.str_size = 16,
.expect_str = "987654321098765",
- .expect_rc = 15, /* exception: on truncation, gsm48_mi_to_string() returns strlen(), not bytes! */
},
{
/* gsm48 treats TMSI as decimal string */
diff --git a/tests/gsm0408/gsm0408_test.ok b/tests/gsm0408/gsm0408_test.ok
index 1dc4249..2db58de 100644
--- a/tests/gsm0408/gsm0408_test.ok
+++ b/tests/gsm0408/gsm0408_test.ok
@@ -23,8 +23,7 @@
-> MI-str="4234235" rc=8
- IMSI 4234235
-> MI-TLV-hex='170449322453'
- -> MI-str="423" rc=3
- ERROR: resulting string is not explicitly nul terminated
+ -> MI-str="423" rc=4
- IMEI 123456789012345
-> MI-TLV-hex='17081a32547698103254'
-> MI-str="123456789012345" rc=16
@@ -39,8 +38,7 @@
-> MI-str="987654321098765432" rc=19
- IMEI-SV 987654321098765432
-> MI-TLV-hex='170a937856341290785634f2'
- -> MI-str="987654321098765" rc=15
- ERROR: resulting string is not explicitly nul terminated
+ -> MI-str="987654321098765" rc=16
- TMSI 305419896
-> MI-TLV-hex='1705f412345678'
-> MI-str="305419896" rc=9
@@ -66,14 +64,14 @@
Decoding zero length Mobile Identities
- MI type: IMSI
- writing to zero-length string:
- rc=1
- ERROR: Wrote to invalid memory!
+ rc=0
+ nothing written
- writing to 1-byte-length string:
rc=1
- ERROR: Wrote unexpected string "1!!!!"
+ returned empty string
- decode zero-length mi:
- rc=2
- ERROR: expected empty string, got output string: "1"
+ rc=1
+ returned empty string
- MI type: TMSI
- writing to zero-length string:
rc=1
@@ -96,14 +94,14 @@
returned empty string
- MI type: IMSI | GSM_MI_ODD
- writing to zero-length string:
- rc=1
- ERROR: Wrote to invalid memory!
+ rc=0
+ nothing written
- writing to 1-byte-length string:
rc=1
- ERROR: Wrote unexpected string "1!!!!"
+ returned empty string
- decode zero-length mi:
- rc=2
- ERROR: expected empty string, got output string: "1"
+ rc=1
+ returned empty string
- MI type: TMSI | GSM_MI_ODD
- writing to zero-length string:
rc=1
--
To view, visit https://gerrit.osmocom.org/12154
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I1b51b72a721e1cc9d69796b804ebda741ff0f36b
Gerrit-Change-Number: 12154
Gerrit-PatchSet: 1
Gerrit-Owner: Neels Hofmeyr <nhofmeyr at sysmocom.de>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20181205/13aec1ea/attachment.htm>