]> git.hungrycats.org Git - linux/commitdiff
[PATCH] PCI: add missing checks in drivers/pci/probe.c.
authorLuiz Capitulino <lcapitulino@conectiva.com.br>
Wed, 6 Oct 2004 06:04:58 +0000 (23:04 -0700)
committerGreg Kroah-Hartman <greg@kroah.com>
Wed, 6 Oct 2004 06:04:58 +0000 (23:04 -0700)
 I noticed drivers/pci/probe.c::pci_scan_bus_parented() has some functions which
the return value is not checked.

 The patch bellow adds the check for device_register(), class_device_register(),
class_device_create_file() and sysfs_create_link().

(hope the error label names are not too ugly).

Signed-off-by: Luiz Capitulino <lcapitulino@conectiva.com.br>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/pci/probe.c

index b57fe552411341f2a720ac5c2ecd6ca4acc1077d..2c234e12b981ce43065f8d7a79965afe30f58984 100644 (file)
@@ -750,6 +750,7 @@ unsigned int __devinit pci_do_scan_bus(struct pci_bus *bus)
 
 struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, int bus, struct pci_ops *ops, void *sysdata)
 {
+       int error;
        struct pci_bus *b;
        struct device *dev;
 
@@ -769,9 +770,7 @@ struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, int bus,
        if (pci_find_bus(pci_domain_nr(b), bus)) {
                /* If we already got to this bus through a different bridge, ignore it */
                DBG("PCI: Bus %02x already known\n", bus);
-               kfree(dev);
-               kfree(b);
-               return NULL;
+               goto err_out;
        }
        list_add_tail(&b->node, &pci_root_buses);
 
@@ -779,15 +778,23 @@ struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, int bus,
        dev->parent = parent;
        dev->release = pci_release_bus_bridge_dev;
        sprintf(dev->bus_id, "pci%04x:%02x", pci_domain_nr(b), bus);
-       device_register(dev);
+       error = device_register(dev);
+       if (error)
+               goto dev_reg_err;
        b->bridge = get_device(dev);
 
        b->class_dev.class = &pcibus_class;
        sprintf(b->class_dev.class_id, "%04x:%02x", pci_domain_nr(b), bus);
-       class_device_register(&b->class_dev);
-       class_device_create_file(&b->class_dev, &class_device_attr_cpuaffinity);
+       error = class_device_register(&b->class_dev);
+       if (error)
+               goto class_dev_reg_err;
+       error = class_device_create_file(&b->class_dev, &class_device_attr_cpuaffinity);
+       if (error)
+               goto class_dev_create_file_err;
 
-       sysfs_create_link(&b->class_dev.kobj, &b->bridge->kobj, "bridge");
+       error = sysfs_create_link(&b->class_dev.kobj, &b->bridge->kobj, "bridge");
+       if (error)
+               goto sys_create_link_err;
 
        b->number = b->secondary = bus;
        b->resource[0] = &ioport_resource;
@@ -798,6 +805,19 @@ struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, int bus,
        pci_bus_add_devices(b);
 
        return b;
+
+sys_create_link_err:
+       class_device_remove_file(&b->class_dev, &class_device_attr_cpuaffinity);
+class_dev_create_file_err:
+       class_device_unregister(&b->class_dev);
+class_dev_reg_err:
+       device_unregister(dev);
+dev_reg_err:
+       list_del(&b->node);
+err_out:
+       kfree(dev);
+       kfree(b);
+       return NULL;
 }
 EXPORT_SYMBOL(pci_scan_bus_parented);