mirror of https://gerrit.osmocom.org/libosmocore
gsm48_decode_bcd_number2(): fix: return -ENOSPC on truncation
The documentation of gsm48_decode_bcd_number2() clearly states that the output truncation is a erroneous case, so it should actually return negative in such cases. Let's return -ENOSPC. Change-Id: I75680f232001ba419a587fed4c24f32c70c3ad2b
This commit is contained in:
parent
2cd1dda631
commit
7194087457
|
@ -66,9 +66,15 @@ int gsm48_decode_bcd_number(char *output, int output_len,
|
|||
* \param[in] bcd_lv Length-Value part of to-be-decoded IE.
|
||||
* \param[in] input_len Size of the bcd_lv buffer for bounds checking.
|
||||
* \param[in] h_len Length of an optional header between L and V parts.
|
||||
* \return 0 in case of success, negative on error. Errors checked: no or too little input data, no or too little
|
||||
* output buffer size, IE length exceeds input data size, decoded number exceeds size of the output buffer. The output
|
||||
* is guaranteed to be nul terminated iff output_len > 0.
|
||||
* \return 0 in case of success, negative on error.
|
||||
*
|
||||
* Errors checked:
|
||||
* - no or too little input data (-EIO),
|
||||
* - IE length exceeds input data size (-EIO),
|
||||
* - no or too little output buffer size (-ENOSPC),
|
||||
* - decoded number exceeds size of the output buffer (-ENOSPC).
|
||||
*
|
||||
* The output is guaranteed to be nul terminated iff output_len > 0.
|
||||
*/
|
||||
int gsm48_decode_bcd_number2(char *output, size_t output_len,
|
||||
const uint8_t *bcd_lv, size_t input_len,
|
||||
|
@ -102,6 +108,10 @@ int gsm48_decode_bcd_number2(char *output, size_t output_len,
|
|||
if (output_len >= 1)
|
||||
*output++ = '\0';
|
||||
|
||||
/* Indicate whether the output was truncated */
|
||||
if (i < in_len)
|
||||
return -ENOSPC;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -702,7 +702,7 @@ static const struct bcd_number_test {
|
|||
/* Decoding test (one 5 digits do not fit) */
|
||||
.dec_hex = "0a21436587092143658709",
|
||||
.dec_ascii = "123456789012345",
|
||||
.dec_rc = 0,
|
||||
.dec_rc = -ENOSPC,
|
||||
|
||||
/* Buffer length limitations */
|
||||
.dec_buf_lim = 15 + 1, /* 5 digits less */
|
||||
|
@ -778,7 +778,7 @@ static void test_bcd_number_encode_decode()
|
|||
printf(" - Expected: (rc=%d) '%s'\n",
|
||||
test->dec_rc, test->dec_ascii);
|
||||
printf(" - Actual: (rc=%d) '%s'\n",
|
||||
rc, rc == 0 ? buf_dec : "(none)");
|
||||
rc, (rc == 0 || rc == -ENOSPC) ? buf_dec : "(none)");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -173,8 +173,8 @@ BSD number encoding / decoding test
|
|||
- Expected: (rc=-5) ''
|
||||
- Actual: (rc=-5) ''
|
||||
- Decoding HEX (buffer limit=16) '0a21436587092143658709'...
|
||||
- Expected: (rc=0) '123456789012345'
|
||||
- Actual: (rc=0) '123456789012345'
|
||||
- Expected: (rc=-28) '123456789012345'
|
||||
- Actual: (rc=-28) '123456789012345'
|
||||
- Running test: LV incorrect length
|
||||
- Decoding HEX (buffer limit=0) '05214365'...
|
||||
- Expected: (rc=-5) '(none)'
|
||||
|
|
Loading…
Reference in New Issue