diff options
| author | Vadim Yanitskiy <axilirator@gmail.com> | 2018-01-17 12:18:27 +0600 | 
|---|---|---|
| committer | Harald Welte <laforge@gnumonks.org> | 2018-01-17 10:45:41 +0000 | 
| commit | b92a27f6944b7fa6f9297a5588b2d9177aa3728b (patch) | |
| tree | 4dacffd98e662c6b546559c2b3ff51fc8c1d95ef /src | |
| parent | ac3b6ac3011d0544f6f04c320ba78df93659f72c (diff) | |
gsm0480: parse all SS info elements in a message
Some SS messages (e.g. RELEASE COMPLETE) may contai multiple
IEs (Information Elements). Let's parse them all.
Change-Id: I20cc59c25fdbda176bcf76437174cda829518d60
Diffstat (limited to 'src')
| -rw-r--r-- | src/gsm/gsm0480.c | 11 | 
1 files changed, 10 insertions, 1 deletions
| diff --git a/src/gsm/gsm0480.c b/src/gsm/gsm0480.c index e3856a56..0f302502 100644 --- a/src/gsm/gsm0480.c +++ b/src/gsm/gsm0480.c @@ -334,11 +334,15 @@ static int parse_ss_info_elements(const uint8_t *ss_ie, uint16_t len,  	uint8_t iei;  	uint8_t iei_length; +	/* We need at least two bytes */ +	if (len < 2) +		return 0; +  	iei = ss_ie[0];  	iei_length = ss_ie[1];  	/* If the data does not fit, report an error */ -	if (len - 2 < iei_length) +	if (iei_length + 2 > len)  		return 0;  	switch (iei) { @@ -356,6 +360,11 @@ static int parse_ss_info_elements(const uint8_t *ss_ie, uint16_t len,  		break;  	} +	/* A message may contain multiple IEs */ +	if (iei_length + 2 + 2 < len) +		rc &= parse_ss_info_elements(ss_ie + iei_length + 2, +			len - iei_length - 2, req); +  	return rc;  } | 
