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>