@@ -595,6 +595,16 @@ static int cxl_cdat_read_table(struct device *dev,
595
595
return 0 ;
596
596
}
597
597
598
+ static unsigned char cdat_checksum (void * buf , size_t size )
599
+ {
600
+ unsigned char sum , * data = buf ;
601
+ size_t i ;
602
+
603
+ for (sum = 0 , i = 0 ; i < size ; i ++ )
604
+ sum += data [i ];
605
+ return sum ;
606
+ }
607
+
598
608
/**
599
609
* read_cdat_data - Read the CDAT data on this port
600
610
* @port: Port to read data from
@@ -634,15 +644,21 @@ void read_cdat_data(struct cxl_port *port)
634
644
return ;
635
645
636
646
rc = cxl_cdat_read_table (dev , cdat_doe , cdat_table , & cdat_length );
637
- if (rc ) {
638
- /* Don't leave table data allocated on error */
639
- devm_kfree (dev , cdat_table );
640
- dev_err (dev , "CDAT data read error\n" );
641
- return ;
642
- }
647
+ if (rc )
648
+ goto err ;
643
649
644
- port -> cdat .table = cdat_table + sizeof (__le32 );
650
+ cdat_table = cdat_table + sizeof (__le32 );
651
+ if (cdat_checksum (cdat_table , cdat_length ))
652
+ goto err ;
653
+
654
+ port -> cdat .table = cdat_table ;
645
655
port -> cdat .length = cdat_length ;
656
+ return ;
657
+
658
+ err :
659
+ /* Don't leave table data allocated on error */
660
+ devm_kfree (dev , cdat_table );
661
+ dev_err (dev , "Failed to read/validate CDAT.\n" );
646
662
}
647
663
EXPORT_SYMBOL_NS_GPL (read_cdat_data , CXL );
648
664
0 commit comments