@@ -398,36 +398,38 @@ EXPORT_SYMBOL_NS_GPL(cxl_endpoint_parse_cdat, CXL);
398398static int cdat_sslbis_handler (union acpi_subtable_headers * header , void * arg ,
399399 const unsigned long end )
400400{
401+ struct acpi_cdat_sslbis_table {
402+ struct acpi_cdat_header header ;
403+ struct acpi_cdat_sslbis sslbis_header ;
404+ struct acpi_cdat_sslbe entries [];
405+ } * tbl = (struct acpi_cdat_sslbis_table * )header ;
406+ int size = sizeof (header -> cdat ) + sizeof (tbl -> sslbis_header );
401407 struct acpi_cdat_sslbis * sslbis ;
402- int size = sizeof (header -> cdat ) + sizeof (* sslbis );
403408 struct cxl_port * port = arg ;
404409 struct device * dev = & port -> dev ;
405- struct acpi_cdat_sslbe * entry ;
406410 int remain , entries , i ;
407411 u16 len ;
408412
409413 len = le16_to_cpu ((__force __le16 )header -> cdat .length );
410414 remain = len - size ;
411- if (!remain || remain % sizeof (* entry ) ||
415+ if (!remain || remain % sizeof (tbl -> entries [ 0 ] ) ||
412416 (unsigned long )header + len > end ) {
413417 dev_warn (dev , "Malformed SSLBIS table length: (%u)\n" , len );
414418 return - EINVAL ;
415419 }
416420
417- /* Skip common header */
418- sslbis = (struct acpi_cdat_sslbis * )((unsigned long )header +
419- sizeof (header -> cdat ));
420-
421+ sslbis = & tbl -> sslbis_header ;
421422 /* Unrecognized data type, we can skip */
422423 if (sslbis -> data_type > ACPI_HMAT_WRITE_BANDWIDTH )
423424 return 0 ;
424425
425- entries = remain / sizeof (* entry );
426- entry = (struct acpi_cdat_sslbe * )((unsigned long )header + sizeof (* sslbis ));
426+ entries = remain / sizeof (tbl -> entries [0 ]);
427+ if (struct_size (tbl , entries , entries ) != len )
428+ return - EINVAL ;
427429
428430 for (i = 0 ; i < entries ; i ++ ) {
429- u16 x = le16_to_cpu ((__force __le16 )entry -> portx_id );
430- u16 y = le16_to_cpu ((__force __le16 )entry -> porty_id );
431+ u16 x = le16_to_cpu ((__force __le16 )tbl -> entries [ i ]. portx_id );
432+ u16 y = le16_to_cpu ((__force __le16 )tbl -> entries [ i ]. porty_id );
431433 __le64 le_base ;
432434 __le16 le_val ;
433435 struct cxl_dport * dport ;
@@ -457,8 +459,8 @@ static int cdat_sslbis_handler(union acpi_subtable_headers *header, void *arg,
457459 break ;
458460 }
459461
460- le_base = (__force __le64 )sslbis -> entry_base_unit ;
461- le_val = (__force __le16 )entry -> latency_or_bandwidth ;
462+ le_base = (__force __le64 )tbl -> sslbis_header . entry_base_unit ;
463+ le_val = (__force __le16 )tbl -> entries [ i ]. latency_or_bandwidth ;
462464
463465 if (check_mul_overflow (le64_to_cpu (le_base ),
464466 le16_to_cpu (le_val ), & val ))
@@ -471,8 +473,6 @@ static int cdat_sslbis_handler(union acpi_subtable_headers *header, void *arg,
471473 sslbis -> data_type ,
472474 val );
473475 }
474-
475- entry ++ ;
476476 }
477477
478478 return 0 ;
0 commit comments