Skip to content

Commit d987de4

Browse files
committed
fix: guard GFD PCI vendor capability parsing against bad lengths
Validate capability header and body bounds before slicing config space so malformed PCI data does not panic gpu-feature-discovery. Signed-off-by: amarkdotdev <amarkdotdev@users.noreply.github.com>
1 parent 2481647 commit d987de4

2 files changed

Lines changed: 28 additions & 1 deletion

File tree

internal/vgpu/pciutil.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ func (d *PCIDevice) GetVendorSpecificCapability() ([]byte, error) {
124124
var visited [256]byte
125125
pos := GetByte(d.Config, PciCapabilityList)
126126
for pos != 0 {
127+
capHeaderEnd := int(pos) + int(PciCapabilityLength) + 1
128+
if capHeaderEnd > len(d.Config) {
129+
break
130+
}
131+
127132
id := GetByte(d.Config, pos+PciCapabilityListID)
128133
next := GetByte(d.Config, pos+PciCapabilityListNext)
129134
length := GetByte(d.Config, pos+PciCapabilityLength)
@@ -137,7 +142,11 @@ func (d *PCIDevice) GetVendorSpecificCapability() ([]byte, error) {
137142
break
138143
}
139144
if id == PciCapabilityVendorSpecificID {
140-
capability := d.Config[pos+PciCapabilityListID : pos+PciCapabilityListID+length]
145+
capEnd := int(pos) + int(PciCapabilityListID) + int(length)
146+
if capEnd > len(d.Config) {
147+
break
148+
}
149+
capability := d.Config[pos+PciCapabilityListID : capEnd]
141150
return capability, nil
142151
}
143152

internal/vgpu/pciutil_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,24 @@ import (
2323
"github.com/stretchr/testify/require"
2424
)
2525

26+
func TestGetVendorSpecificCapabilityMalformedLength(t *testing.T) {
27+
config := make([]byte, 256)
28+
config[PciStatusByte] = PciStatusCapabilityList
29+
config[PciCapabilityList] = 224
30+
31+
config[224+PciCapabilityListID] = PciCapabilityVendorSpecificID
32+
config[224+PciCapabilityLength] = 100
33+
34+
device := &PCIDevice{
35+
Address: "malformed",
36+
Config: config,
37+
}
38+
39+
capability, err := device.GetVendorSpecificCapability()
40+
require.NoError(t, err)
41+
require.Nil(t, capability)
42+
}
43+
2644
func TestGetVendorSpecificCapability(t *testing.T) {
2745
devices, _ := NewMockNvidiaPCI().Devices()
2846
for _, device := range devices {

0 commit comments

Comments
 (0)