gsm0808: fix length check of the element decoder functions

The length check of the decoder functions is not entirely
correct. The check also checks for values below zero,
which does not make sense, since the length is encoded
as uint8_t.

For some elements a minimum length is known (in most cases
this is 1), so checking for zero is sufficient but in some
cases (e.g. channel type) the spec mentions a minimum and
maximum length. This is now also reflected in the code.

Tweaked-by: nhofmeyr
Change-Id: I78bc887f68d1963d28c6fcd631ac20ccd893d6d6
This commit is contained in:
Philipp Maier 2017-04-28 11:05:44 +02:00 committed by Neels Hofmeyr
parent 00f4ef7262
commit 17778bda23
1 changed files with 6 additions and 6 deletions

View File

@ -104,7 +104,7 @@ int gsm0808_dec_aoip_trasp_addr(struct sockaddr_storage *ss,
OSMO_ASSERT(ss);
if (!elem)
return -EINVAL;
if (len <= 0)
if (len == 0)
return -EINVAL;
memset(ss, 0, sizeof(*ss));
@ -261,7 +261,7 @@ int gsm0808_dec_speech_codec(struct gsm0808_speech_codec *sc,
OSMO_ASSERT(sc);
if (!elem)
return -EINVAL;
if (len <= 0)
if (len == 0)
return -EINVAL;
memset(sc, 0, sizeof(*sc));
@ -377,7 +377,7 @@ int gsm0808_dec_speech_codec_list(struct gsm0808_speech_codec_list *scl,
OSMO_ASSERT(scl);
if (!elem)
return -EINVAL;
if (len <= 0)
if (len == 0)
return -EINVAL;
memset(scl, 0, sizeof(*scl));
@ -461,7 +461,7 @@ int gsm0808_dec_channel_type(struct gsm0808_channel_type *ct,
OSMO_ASSERT(ct);
if (!elem)
return -EINVAL;
if (len <= 0)
if (len < 3 || len > 11)
return -EINVAL;
memset(ct, 0, sizeof(*ct));
@ -537,7 +537,7 @@ int gsm0808_dec_encrypt_info(struct gsm0808_encrypt_info *ei,
OSMO_ASSERT(ei);
if (!elem)
return -EINVAL;
if (len <= 0)
if (len == 0)
return -EINVAL;
memset(ei, 0, sizeof(*ei));
@ -614,7 +614,7 @@ int gsm0808_dec_cell_id_list(struct gsm0808_cell_id_list *cil,
OSMO_ASSERT(cil);
if (!elem)
return -EINVAL;
if (len <= 0)
if (len == 0)
return -EINVAL;
memset(cil, 0, sizeof(*cil));