diff options
| author | Johan Hedberg <johan.hedberg@nokia.com> | 2009-02-24 13:30:07 +0200 | 
|---|---|---|
| committer | Johan Hedberg <johan.hedberg@nokia.com> | 2009-02-24 13:30:07 +0200 | 
| commit | f48c24c3d758934fa5d3edfd49c9a2bced272e5b (patch) | |
| tree | 0ddf1dccfceb7b13475b9a3010182d4e358d96de | |
| parent | 9f7089874b304f036358716a304bbfb2c869297b (diff) | |
Be more strict about codec capability length checks
| -rw-r--r-- | audio/a2dp.c | 30 | 
1 files changed, 19 insertions, 11 deletions
diff --git a/audio/a2dp.c b/audio/a2dp.c index 3ce255e8..e633c855 100644 --- a/audio/a2dp.c +++ b/audio/a2dp.c @@ -302,19 +302,27 @@ static gboolean sbc_setconf_ind(struct avdtp *session,  	/* Check bipool range */  	for (codec_cap = NULL; caps; caps = g_slist_next(caps)) {  		cap = caps->data; -		if (cap->category == AVDTP_MEDIA_CODEC) { -			codec_cap = (void *) cap->data; -			if (codec_cap->media_codec_type == A2DP_CODEC_SBC) { -				sbc_cap = (void *) codec_cap; -				if (sbc_cap->min_bitpool < MIN_BITPOOL || +		if (cap->category != AVDTP_MEDIA_CODEC) +			continue; + +		if (cap->length < sizeof(struct sbc_codec_cap)) +			continue; + +		codec_cap = (void *) cap->data; + +		if (codec_cap->media_codec_type != A2DP_CODEC_SBC) +			continue; + +		sbc_cap = (void *) codec_cap; + +		if (sbc_cap->min_bitpool < MIN_BITPOOL ||  					sbc_cap->max_bitpool > MAX_BITPOOL) { -					*err = AVDTP_UNSUPPORTED_CONFIGURATION; -					*category = AVDTP_MEDIA_CODEC; -					return FALSE; -				} -			} -			break; +			*err = AVDTP_UNSUPPORTED_CONFIGURATION; +			*category = AVDTP_MEDIA_CODEC; +			return FALSE;  		} + +		break;  	}  	avdtp_stream_add_cb(session, stream, stream_state_changed, a2dp_sep);  | 
