pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-netif/+/26788 )
Change subject: amr: Fix length check in osmo_amr_bwe_to_iuup ......................................................................
amr: Fix length check in osmo_amr_bwe_to_iuup
The check was wrong for format types containing extra bits not aligned to byte boundaries, such as FT7 (AMR Code 12.20, 244 bits, 31 bytes).
if the source has 1-6 extra bits, they can be fit with one less byte when shifting 10 bits to the left.
Change-Id: I0552d727585886d25f613e64ca815fb6dcd53f25 --- M src/amr.c 1 file changed, 9 insertions(+), 6 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/88/26788/1
diff --git a/src/amr.c b/src/amr.c index 2df6967..ed92f30 100644 --- a/src/amr.c +++ b/src/amr.c @@ -228,8 +228,8 @@ int osmo_amr_bwe_to_iuup(uint8_t *payload, unsigned int payload_len) { /* The header is only valid after shifting first two bytes to OA mode */ - unsigned int i; - unsigned int amr_speech_len; + unsigned int i, required_len; + unsigned int amr_speech_len_bytes, amr_speech_len_bits; uint8_t ft;
if (payload_len < 2) @@ -240,16 +240,19 @@ if (!osmo_amr_ft_valid(ft)) return -1;
- amr_speech_len = osmo_amr_bytes(ft); - if (payload_len < amr_speech_len + 2) + amr_speech_len_bits = osmo_amr_bits(ft); + amr_speech_len_bytes = osmo_amr_bytes(ft); + + required_len = amr_speech_len_bits + 10; /* shift of 10 bits */ + if (payload_len < (required_len + 7)/8) return -1;
- for (i = 0; i < amr_speech_len; i++) { + for (i = 0; i < amr_speech_len_bytes; i++) { /* we have to shift the payload by 10 bits to get only the Class A, B, C bits */ payload[i] = (payload[i + 1] << 2) | ((payload[i + 2]) >> 6); }
- return amr_speech_len; + return amr_speech_len_bytes; }
/*! Convert an AMR frame from IuuP/IuFP payload to bandwith-efficient mode.