@@ -398,36 +398,38 @@ EXPORT_SYMBOL_NS_GPL(cxl_endpoint_parse_cdat, CXL);
398
398
static int cdat_sslbis_handler (union acpi_subtable_headers * header , void * arg ,
399
399
const unsigned long end )
400
400
{
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 );
401
407
struct acpi_cdat_sslbis * sslbis ;
402
- int size = sizeof (header -> cdat ) + sizeof (* sslbis );
403
408
struct cxl_port * port = arg ;
404
409
struct device * dev = & port -> dev ;
405
- struct acpi_cdat_sslbe * entry ;
406
410
int remain , entries , i ;
407
411
u16 len ;
408
412
409
413
len = le16_to_cpu ((__force __le16 )header -> cdat .length );
410
414
remain = len - size ;
411
- if (!remain || remain % sizeof (* entry ) ||
415
+ if (!remain || remain % sizeof (tbl -> entries [ 0 ] ) ||
412
416
(unsigned long )header + len > end ) {
413
417
dev_warn (dev , "Malformed SSLBIS table length: (%u)\n" , len );
414
418
return - EINVAL ;
415
419
}
416
420
417
- /* Skip common header */
418
- sslbis = (struct acpi_cdat_sslbis * )((unsigned long )header +
419
- sizeof (header -> cdat ));
420
-
421
+ sslbis = & tbl -> sslbis_header ;
421
422
/* Unrecognized data type, we can skip */
422
423
if (sslbis -> data_type > ACPI_HMAT_WRITE_BANDWIDTH )
423
424
return 0 ;
424
425
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 ;
427
429
428
430
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 );
431
433
__le64 le_base ;
432
434
__le16 le_val ;
433
435
struct cxl_dport * dport ;
@@ -457,8 +459,8 @@ static int cdat_sslbis_handler(union acpi_subtable_headers *header, void *arg,
457
459
break ;
458
460
}
459
461
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 ;
462
464
463
465
if (check_mul_overflow (le64_to_cpu (le_base ),
464
466
le16_to_cpu (le_val ), & val ))
@@ -471,8 +473,6 @@ static int cdat_sslbis_handler(union acpi_subtable_headers *header, void *arg,
471
473
sslbis -> data_type ,
472
474
val );
473
475
}
474
-
475
- entry ++ ;
476
476
}
477
477
478
478
return 0 ;
0 commit comments