drm/amdgpu/pptable: Fix UBSAN array-index-out-of-bounds
Flexible arrays used [1] instead of []. Replace the former with the latter to resolve multiple UBSAN warnings observed on boot with a BONAIRE card. In addition, use the __counted_by attribute where possible to hint the length of the arrays to the compiler and any sanitizers. Signed-off-by: Tasos Sahanidis <tasos@tasossah.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
267cace556
commit
c6c4dd5401
@ -477,31 +477,30 @@ typedef struct _ATOM_PPLIB_STATE_V2
|
|||||||
} ATOM_PPLIB_STATE_V2;
|
} ATOM_PPLIB_STATE_V2;
|
||||||
|
|
||||||
typedef struct _StateArray{
|
typedef struct _StateArray{
|
||||||
//how many states we have
|
//how many states we have
|
||||||
UCHAR ucNumEntries;
|
UCHAR ucNumEntries;
|
||||||
|
|
||||||
ATOM_PPLIB_STATE_V2 states[1];
|
ATOM_PPLIB_STATE_V2 states[] /* __counted_by(ucNumEntries) */;
|
||||||
}StateArray;
|
}StateArray;
|
||||||
|
|
||||||
|
|
||||||
typedef struct _ClockInfoArray{
|
typedef struct _ClockInfoArray{
|
||||||
//how many clock levels we have
|
//how many clock levels we have
|
||||||
UCHAR ucNumEntries;
|
UCHAR ucNumEntries;
|
||||||
|
|
||||||
//sizeof(ATOM_PPLIB_CLOCK_INFO)
|
//sizeof(ATOM_PPLIB_CLOCK_INFO)
|
||||||
UCHAR ucEntrySize;
|
UCHAR ucEntrySize;
|
||||||
|
|
||||||
UCHAR clockInfo[];
|
UCHAR clockInfo[];
|
||||||
}ClockInfoArray;
|
}ClockInfoArray;
|
||||||
|
|
||||||
typedef struct _NonClockInfoArray{
|
typedef struct _NonClockInfoArray{
|
||||||
|
//how many non-clock levels we have. normally should be same as number of states
|
||||||
|
UCHAR ucNumEntries;
|
||||||
|
//sizeof(ATOM_PPLIB_NONCLOCK_INFO)
|
||||||
|
UCHAR ucEntrySize;
|
||||||
|
|
||||||
//how many non-clock levels we have. normally should be same as number of states
|
ATOM_PPLIB_NONCLOCK_INFO nonClockInfo[] __counted_by(ucNumEntries);
|
||||||
UCHAR ucNumEntries;
|
|
||||||
//sizeof(ATOM_PPLIB_NONCLOCK_INFO)
|
|
||||||
UCHAR ucEntrySize;
|
|
||||||
|
|
||||||
ATOM_PPLIB_NONCLOCK_INFO nonClockInfo[];
|
|
||||||
}NonClockInfoArray;
|
}NonClockInfoArray;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Record
|
typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Record
|
||||||
@ -513,8 +512,10 @@ typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Record
|
|||||||
|
|
||||||
typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Table
|
typedef struct _ATOM_PPLIB_Clock_Voltage_Dependency_Table
|
||||||
{
|
{
|
||||||
UCHAR ucNumEntries; // Number of entries.
|
// Number of entries.
|
||||||
ATOM_PPLIB_Clock_Voltage_Dependency_Record entries[1]; // Dynamically allocate entries.
|
UCHAR ucNumEntries;
|
||||||
|
// Dynamically allocate entries.
|
||||||
|
ATOM_PPLIB_Clock_Voltage_Dependency_Record entries[] __counted_by(ucNumEntries);
|
||||||
}ATOM_PPLIB_Clock_Voltage_Dependency_Table;
|
}ATOM_PPLIB_Clock_Voltage_Dependency_Table;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Record
|
typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Record
|
||||||
@ -529,8 +530,10 @@ typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Record
|
|||||||
|
|
||||||
typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Table
|
typedef struct _ATOM_PPLIB_Clock_Voltage_Limit_Table
|
||||||
{
|
{
|
||||||
UCHAR ucNumEntries; // Number of entries.
|
// Number of entries.
|
||||||
ATOM_PPLIB_Clock_Voltage_Limit_Record entries[1]; // Dynamically allocate entries.
|
UCHAR ucNumEntries;
|
||||||
|
// Dynamically allocate entries.
|
||||||
|
ATOM_PPLIB_Clock_Voltage_Limit_Record entries[] __counted_by(ucNumEntries);
|
||||||
}ATOM_PPLIB_Clock_Voltage_Limit_Table;
|
}ATOM_PPLIB_Clock_Voltage_Limit_Table;
|
||||||
|
|
||||||
union _ATOM_PPLIB_CAC_Leakage_Record
|
union _ATOM_PPLIB_CAC_Leakage_Record
|
||||||
@ -553,8 +556,10 @@ typedef union _ATOM_PPLIB_CAC_Leakage_Record ATOM_PPLIB_CAC_Leakage_Record;
|
|||||||
|
|
||||||
typedef struct _ATOM_PPLIB_CAC_Leakage_Table
|
typedef struct _ATOM_PPLIB_CAC_Leakage_Table
|
||||||
{
|
{
|
||||||
UCHAR ucNumEntries; // Number of entries.
|
// Number of entries.
|
||||||
ATOM_PPLIB_CAC_Leakage_Record entries[1]; // Dynamically allocate entries.
|
UCHAR ucNumEntries;
|
||||||
|
// Dynamically allocate entries.
|
||||||
|
ATOM_PPLIB_CAC_Leakage_Record entries[] __counted_by(ucNumEntries);
|
||||||
}ATOM_PPLIB_CAC_Leakage_Table;
|
}ATOM_PPLIB_CAC_Leakage_Table;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Record
|
typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Record
|
||||||
@ -568,8 +573,10 @@ typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Record
|
|||||||
|
|
||||||
typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Table
|
typedef struct _ATOM_PPLIB_PhaseSheddingLimits_Table
|
||||||
{
|
{
|
||||||
UCHAR ucNumEntries; // Number of entries.
|
// Number of entries.
|
||||||
ATOM_PPLIB_PhaseSheddingLimits_Record entries[1]; // Dynamically allocate entries.
|
UCHAR ucNumEntries;
|
||||||
|
// Dynamically allocate entries.
|
||||||
|
ATOM_PPLIB_PhaseSheddingLimits_Record entries[] __counted_by(ucNumEntries);
|
||||||
}ATOM_PPLIB_PhaseSheddingLimits_Table;
|
}ATOM_PPLIB_PhaseSheddingLimits_Table;
|
||||||
|
|
||||||
typedef struct _VCEClockInfo{
|
typedef struct _VCEClockInfo{
|
||||||
@ -580,8 +587,8 @@ typedef struct _VCEClockInfo{
|
|||||||
}VCEClockInfo;
|
}VCEClockInfo;
|
||||||
|
|
||||||
typedef struct _VCEClockInfoArray{
|
typedef struct _VCEClockInfoArray{
|
||||||
UCHAR ucNumEntries;
|
UCHAR ucNumEntries;
|
||||||
VCEClockInfo entries[1];
|
VCEClockInfo entries[] __counted_by(ucNumEntries);
|
||||||
}VCEClockInfoArray;
|
}VCEClockInfoArray;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record
|
typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record
|
||||||
@ -592,8 +599,8 @@ typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record
|
|||||||
|
|
||||||
typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table
|
typedef struct _ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table
|
||||||
{
|
{
|
||||||
UCHAR numEntries;
|
UCHAR numEntries;
|
||||||
ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record entries[1];
|
ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record entries[] __counted_by(numEntries);
|
||||||
}ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table;
|
}ATOM_PPLIB_VCE_Clock_Voltage_Limit_Table;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_VCE_State_Record
|
typedef struct _ATOM_PPLIB_VCE_State_Record
|
||||||
@ -604,8 +611,8 @@ typedef struct _ATOM_PPLIB_VCE_State_Record
|
|||||||
|
|
||||||
typedef struct _ATOM_PPLIB_VCE_State_Table
|
typedef struct _ATOM_PPLIB_VCE_State_Table
|
||||||
{
|
{
|
||||||
UCHAR numEntries;
|
UCHAR numEntries;
|
||||||
ATOM_PPLIB_VCE_State_Record entries[1];
|
ATOM_PPLIB_VCE_State_Record entries[] __counted_by(numEntries);
|
||||||
}ATOM_PPLIB_VCE_State_Table;
|
}ATOM_PPLIB_VCE_State_Table;
|
||||||
|
|
||||||
|
|
||||||
@ -626,8 +633,8 @@ typedef struct _UVDClockInfo{
|
|||||||
}UVDClockInfo;
|
}UVDClockInfo;
|
||||||
|
|
||||||
typedef struct _UVDClockInfoArray{
|
typedef struct _UVDClockInfoArray{
|
||||||
UCHAR ucNumEntries;
|
UCHAR ucNumEntries;
|
||||||
UVDClockInfo entries[1];
|
UVDClockInfo entries[] __counted_by(ucNumEntries);
|
||||||
}UVDClockInfoArray;
|
}UVDClockInfoArray;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record
|
typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record
|
||||||
@ -638,8 +645,8 @@ typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record
|
|||||||
|
|
||||||
typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table
|
typedef struct _ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table
|
||||||
{
|
{
|
||||||
UCHAR numEntries;
|
UCHAR numEntries;
|
||||||
ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record entries[1];
|
ATOM_PPLIB_UVD_Clock_Voltage_Limit_Record entries[] __counted_by(numEntries);
|
||||||
}ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table;
|
}ATOM_PPLIB_UVD_Clock_Voltage_Limit_Table;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_UVD_Table
|
typedef struct _ATOM_PPLIB_UVD_Table
|
||||||
@ -657,8 +664,8 @@ typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Record
|
|||||||
}ATOM_PPLIB_SAMClk_Voltage_Limit_Record;
|
}ATOM_PPLIB_SAMClk_Voltage_Limit_Record;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Table{
|
typedef struct _ATOM_PPLIB_SAMClk_Voltage_Limit_Table{
|
||||||
UCHAR numEntries;
|
UCHAR numEntries;
|
||||||
ATOM_PPLIB_SAMClk_Voltage_Limit_Record entries[];
|
ATOM_PPLIB_SAMClk_Voltage_Limit_Record entries[] __counted_by(numEntries);
|
||||||
}ATOM_PPLIB_SAMClk_Voltage_Limit_Table;
|
}ATOM_PPLIB_SAMClk_Voltage_Limit_Table;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_SAMU_Table
|
typedef struct _ATOM_PPLIB_SAMU_Table
|
||||||
@ -675,8 +682,8 @@ typedef struct _ATOM_PPLIB_ACPClk_Voltage_Limit_Record
|
|||||||
}ATOM_PPLIB_ACPClk_Voltage_Limit_Record;
|
}ATOM_PPLIB_ACPClk_Voltage_Limit_Record;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_ACPClk_Voltage_Limit_Table{
|
typedef struct _ATOM_PPLIB_ACPClk_Voltage_Limit_Table{
|
||||||
UCHAR numEntries;
|
UCHAR numEntries;
|
||||||
ATOM_PPLIB_ACPClk_Voltage_Limit_Record entries[1];
|
ATOM_PPLIB_ACPClk_Voltage_Limit_Record entries[] __counted_by(numEntries);
|
||||||
}ATOM_PPLIB_ACPClk_Voltage_Limit_Table;
|
}ATOM_PPLIB_ACPClk_Voltage_Limit_Table;
|
||||||
|
|
||||||
typedef struct _ATOM_PPLIB_ACP_Table
|
typedef struct _ATOM_PPLIB_ACP_Table
|
||||||
@ -743,9 +750,9 @@ typedef struct ATOM_PPLIB_VQ_Budgeting_Record{
|
|||||||
} ATOM_PPLIB_VQ_Budgeting_Record;
|
} ATOM_PPLIB_VQ_Budgeting_Record;
|
||||||
|
|
||||||
typedef struct ATOM_PPLIB_VQ_Budgeting_Table {
|
typedef struct ATOM_PPLIB_VQ_Budgeting_Table {
|
||||||
UCHAR revid;
|
UCHAR revid;
|
||||||
UCHAR numEntries;
|
UCHAR numEntries;
|
||||||
ATOM_PPLIB_VQ_Budgeting_Record entries[1];
|
ATOM_PPLIB_VQ_Budgeting_Record entries[] __counted_by(numEntries);
|
||||||
} ATOM_PPLIB_VQ_Budgeting_Table;
|
} ATOM_PPLIB_VQ_Budgeting_Table;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
Loading…
Reference in New Issue
Block a user