diff options
author | Jean Delvare <khali@linux-fr.org> | 2007-04-07 11:21:28 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-05-02 22:02:35 -0400 |
commit | 6ba186361ed2cda7e174856a3ab8a8e3237b3c3d (patch) | |
tree | 97fe2b10ee8f11b914ea891a3872c4da4f542a6d /drivers/pci | |
parent | 40ee9e9f8d52d85f2446bbdda7823a3f1de62f3f (diff) |
PCI: Require vendor and device for new_id
Currently, there is no minimum number of fields required when adding
a new device ID to a PCI driver through the new_id sysfs file. It is
possible to add a new ID with only the vendor ID set, causing the
driver to attempt to attach to all PCI devices from that vendor. This
has been reported to happen accidentally:
http://lists.lm-sensors.org/pipermail/lm-sensors/2007-March/019366.html
It is even possible to not even set the vendor ID field, causing the
driver to attempt to attach to _all_ the PCI devices.
This sounds dangerous and I fail to see any valid use of this
"feature". Thus I suggest that we now require at least the first two
fields (vendor ID and device ID) to be set. For what it's worth, this
is what the USB subsystem does.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/pci-driver.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 39e80fcef4b3..07fdb3cd6172 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -52,7 +52,7 @@ store_new_id(struct device_driver *driver, const char *buf, size_t count) | |||
52 | { | 52 | { |
53 | struct pci_dynid *dynid; | 53 | struct pci_dynid *dynid; |
54 | struct pci_driver *pdrv = to_pci_driver(driver); | 54 | struct pci_driver *pdrv = to_pci_driver(driver); |
55 | __u32 vendor=PCI_ANY_ID, device=PCI_ANY_ID, subvendor=PCI_ANY_ID, | 55 | __u32 vendor, device, subvendor=PCI_ANY_ID, |
56 | subdevice=PCI_ANY_ID, class=0, class_mask=0; | 56 | subdevice=PCI_ANY_ID, class=0, class_mask=0; |
57 | unsigned long driver_data=0; | 57 | unsigned long driver_data=0; |
58 | int fields=0; | 58 | int fields=0; |
@@ -61,7 +61,7 @@ store_new_id(struct device_driver *driver, const char *buf, size_t count) | |||
61 | fields = sscanf(buf, "%x %x %x %x %x %x %lux", | 61 | fields = sscanf(buf, "%x %x %x %x %x %x %lux", |
62 | &vendor, &device, &subvendor, &subdevice, | 62 | &vendor, &device, &subvendor, &subdevice, |
63 | &class, &class_mask, &driver_data); | 63 | &class, &class_mask, &driver_data); |
64 | if (fields < 0) | 64 | if (fields < 2) |
65 | return -EINVAL; | 65 | return -EINVAL; |
66 | 66 | ||
67 | dynid = kzalloc(sizeof(*dynid), GFP_KERNEL); | 67 | dynid = kzalloc(sizeof(*dynid), GFP_KERNEL); |