@@ -161,6 +161,7 @@ struct UX_HOST_CLASS_AUDIO10_SAM_PARSER *parser = (struct UX_HOST_CLAS
161161UX_HOST_CLASS_AUDIO_SAMPLING_CHARACTERISTICS sam_attr ;
162162ULONG n , offset ;
163163UINT 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{
273316struct 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;
546601UCHAR * buffer ;
547602ULONG n_sub , param_len , offset ;
548603UX_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