Skip to content

Commit 652c294

Browse files
authored
Merge commit from fork
Add bounds check for sampling frequency in audio descriptor parsing
2 parents a769f11 + 50882b4 commit 652c294

File tree

2 files changed

+75
-6
lines changed

2 files changed

+75
-6
lines changed

common/usbx_host_classes/src/ux_host_class_audio_descriptors_parse.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ UINT status;
102102

103103
/* Ensure the instance is valid. */
104104
if (_ux_host_stack_class_instance_verify(_ux_system_host_class_audio_name, (VOID *) audio) != UX_SUCCESS)
105-
{
105+
{
106106

107107
/* Error trap. */
108108
_ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_HOST_CLASS_INSTANCE_UNKNOWN);
@@ -134,12 +134,13 @@ UINT status;
134134

135135
/* Gather the length, type and subtype of the descriptor. */
136136
descriptor_length = *descriptor;
137-
descriptor_type = *(descriptor + 1);
138137

139-
/* Make sure this descriptor has at least the minimum length. */
138+
/* Make sure this descriptor has at least the minimum length. */
140139
if (descriptor_length < 3)
141140
return(UX_DESCRIPTOR_CORRUPTED);
142141

142+
descriptor_type = *(descriptor + 1);
143+
143144
/* Process relative to descriptor type. */
144145
switch (descriptor_type)
145146
{
@@ -173,7 +174,6 @@ UINT status;
173174
/* Have we found the audio interface yet? */
174175
if (interface_descriptor != UX_NULL)
175176
{
176-
177177
/* Yes, parse the audio specific descriptor. */
178178
status = parse_function(arg, interface_descriptor, endpoint_descriptor, descriptor);
179179

common/usbx_host_classes/src/ux_host_class_audio_raw_sampling_parse.c

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ struct UX_HOST_CLASS_AUDIO10_SAM_PARSER *parser = (struct UX_HOST_CLAS
161161
UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS sam_attr;
162162
ULONG n, offset;
163163
UINT status;
164+
UINT descriptor_length = packed_audio_descriptor[0];
164165

165166
UX_PARAMETER_NOT_USED(packed_endpoint_descriptor);
166167

@@ -178,10 +179,32 @@ UINT status;
178179
if (packed_audio_descriptor[2] != UX_HOST_CLASS_AUDIO_CS_FORMAT_TYPE)
179180
return(0);
180181

182+
if (descriptor_length < 4)
183+
{
184+
/* Error trap. */
185+
_ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_DESCRIPTOR_CORRUPTED);
186+
187+
/* If trace is enabled, insert this event into the trace buffer. */
188+
UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_DESCRIPTOR_CORRUPTED, descriptor, 0, 0, UX_TRACE_ERRORS, 0, 0)
189+
190+
return(UX_DESCRIPTOR_CORRUPTED);
191+
}
192+
181193
/* Check bFormatType @ 3. */
182194
if (packed_audio_descriptor[3] != UX_HOST_CLASS_AUDIO_FORMAT_TYPE_I)
183195
return(0);
184196

197+
if (descriptor_length < 8)
198+
{
199+
/* Error trap. */
200+
_ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_DESCRIPTOR_CORRUPTED);
201+
202+
/* If trace is enabled, insert this event into the trace buffer. */
203+
UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_DESCRIPTOR_CORRUPTED, descriptor, 0, 0, UX_TRACE_ERRORS, 0, 0)
204+
205+
return(UX_DESCRIPTOR_CORRUPTED);
206+
}
207+
185208
/* Get bNrChannels @ 4. */
186209
sam_attr.ux_host_class_audio_sampling_characteristics_channels = packed_audio_descriptor[4];
187210

@@ -196,6 +219,16 @@ UINT status;
196219
/* Check bSamFreqType @ 7. */
197220
if (packed_audio_descriptor[7] == 0)
198221
{
222+
if (descriptor_length < 14)
223+
{
224+
/* Error trap. */
225+
_ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_DESCRIPTOR_CORRUPTED);
226+
227+
/* If trace is enabled, insert this event into the trace buffer. */
228+
UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_DESCRIPTOR_CORRUPTED, descriptor, 0, 0, UX_TRACE_ERRORS, 0, 0)
229+
230+
return(UX_DESCRIPTOR_CORRUPTED);
231+
}
199232

200233
/* Continuous, get dLowSamFreq and dHighSamFreq. */
201234
sam_attr.ux_host_class_audio_sampling_characteristics_frequency_low =
@@ -213,6 +246,16 @@ UINT status;
213246
}
214247
else
215248
{
249+
if (descriptor_length < (8 + (3 * packed_audio_descriptor[7])))
250+
{
251+
/* Error trap. */
252+
_ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_DESCRIPTOR_CORRUPTED);
253+
254+
/* If trace is enabled, insert this event into the trace buffer. */
255+
UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_DESCRIPTOR_CORRUPTED, descriptor, 0, 0, UX_TRACE_ERRORS, 0, 0)
256+
257+
return(UX_DESCRIPTOR_CORRUPTED);
258+
}
216259

217260
/* Parse list of sampling characteristics. */
218261
for (n = 0, offset = 8;
@@ -271,6 +314,7 @@ static UINT _ux_host_class_audio_ac_find_parse(VOID *arg,
271314
UCHAR *packed_audio_descriptor)
272315
{
273316
struct UX_HOST_CLASS_AUDIO_AC_DESCR_FINDER_STRUCT *finder = (struct UX_HOST_CLASS_AUDIO_AC_DESCR_FINDER_STRUCT *)arg;
317+
UINT descriptor_length = packed_audio_descriptor[0];
274318

275319
UX_PARAMETER_NOT_USED(packed_endpoint_descriptor);
276320

@@ -289,6 +333,17 @@ struct UX_HOST_CLASS_AUDIO_AC_DESCR_FINDER_STRUCT *finder = (struct UX_HOST_CLAS
289333
if (packed_audio_descriptor[2] != finder -> subtype)
290334
return(0);
291335

336+
if (descriptor_length < 4)
337+
{
338+
/* Error trap. */
339+
_ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_DESCRIPTOR_CORRUPTED);
340+
341+
/* If trace is enabled, insert this event into the trace buffer. */
342+
UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_DESCRIPTOR_CORRUPTED, descriptor, 0, 0, UX_TRACE_ERRORS, 0, 0)
343+
344+
return(0);
345+
}
346+
292347
/* Check bEntityID @ 3. */
293348
if (packed_audio_descriptor[3] != finder -> id)
294349
return(0);
@@ -332,7 +387,7 @@ UINT status;
332387

333388
if (audio -> ux_host_class_audio_type == UX_HOST_CLASS_AUDIO_INPUT)
334389
{
335-
390+
336391
/* If audio input, streaming is from output terminal (OT). */
337392
descriptor = _ux_host_class_audio_ac_find(audio,
338393
UX_CLASS_AUDIO20_AC_OUTPUT_TERMINAL,
@@ -546,6 +601,7 @@ UX_TRANSFER *transfer;
546601
UCHAR *buffer;
547602
ULONG n_sub, param_len, offset;
548603
UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS sam_attr;
604+
UINT descriptor_length = packed_audio_descriptor[0];
549605

550606
UX_PARAMETER_NOT_USED(packed_endpoint_descriptor);
551607

@@ -571,6 +627,19 @@ UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS sam_attr;
571627
/* Check bDescriptorSubType@2, bFormatType@3 to confirm FORMAT_TYPE_I. */
572628
if (packed_audio_descriptor[2] != UX_CLASS_AUDIO20_AS_FORMAT_TYPE)
573629
return(0);
630+
631+
if (descriptor_length < 6)
632+
{
633+
/* Error trap. */
634+
_ux_system_error_handler(UX_SYSTEM_LEVEL_THREAD, UX_SYSTEM_CONTEXT_CLASS, UX_DESCRIPTOR_CORRUPTED);
635+
636+
/* If trace is enabled, insert this event into the trace buffer. */
637+
UX_TRACE_IN_LINE_INSERT(UX_TRACE_ERROR, UX_DESCRIPTOR_CORRUPTED, descriptor, 0, 0, UX_TRACE_ERRORS, 0, 0)
638+
639+
parser -> status = UX_DESCRIPTOR_CORRUPTED;
640+
return(1);
641+
}
642+
574643
if (packed_audio_descriptor[3] != UX_CLASS_AUDIO20_FORMAT_TYPE_I)
575644
return(0);
576645

@@ -654,7 +723,7 @@ UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS sam_attr;
654723
parser -> status = UX_MATH_OVERFLOW;
655724
return(1);
656725
}
657-
726+
658727
/* Allocate buffer for GET_RANGE. */
659728
buffer = _ux_utility_memory_allocate(UX_NO_ALIGN, UX_CACHE_SAFE_MEMORY, param_len);
660729
if (buffer == UX_NULL)

0 commit comments

Comments
 (0)