- In device_probe_child(9) check the return value of device_set_driver(9)
when actually setting a driver as especially ENOMEM is fatal in these cases. - Annotate other calls to device_set_devclass(9) and device_set_driver(9) without the return value being checked and that are okay to fail. Reviewed by: yongari (slightly earlier version)
This commit is contained in:
parent
dd3857eae1
commit
7b5b9bafe6
@ -1129,7 +1129,7 @@ devclass_driver_deleted(devclass_t busclass, devclass_t dc, driver_t *driver)
|
||||
dev->parent->devclass == busclass) {
|
||||
if ((error = device_detach(dev)) != 0)
|
||||
return (error);
|
||||
device_set_driver(dev, NULL);
|
||||
(void)device_set_driver(dev, NULL);
|
||||
BUS_PROBE_NOMATCH(dev->parent, dev);
|
||||
devnomatch(dev);
|
||||
dev->flags |= DF_DONENOMATCH;
|
||||
@ -2007,19 +2007,22 @@ device_probe_child(device_t dev, device_t child)
|
||||
for (dl = first_matching_driver(dc, child);
|
||||
dl;
|
||||
dl = next_matching_driver(dc, child, dl)) {
|
||||
|
||||
/* If this driver's pass is too high, then ignore it. */
|
||||
if (dl->pass > bus_current_pass)
|
||||
continue;
|
||||
|
||||
PDEBUG(("Trying %s", DRIVERNAME(dl->driver)));
|
||||
device_set_driver(child, dl->driver);
|
||||
result = device_set_driver(child, dl->driver);
|
||||
if (result == ENOMEM)
|
||||
return (result);
|
||||
else if (result != 0)
|
||||
continue;
|
||||
if (!hasclass) {
|
||||
if (device_set_devclass(child, dl->driver->name)) {
|
||||
printf("driver bug: Unable to set devclass (devname: %s)\n",
|
||||
(child ? device_get_name(child) :
|
||||
"no device"));
|
||||
device_set_driver(child, NULL);
|
||||
(void)device_set_driver(child, NULL);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -2033,7 +2036,7 @@ device_probe_child(device_t dev, device_t child)
|
||||
/* Reset flags and devclass before the next probe. */
|
||||
child->devflags = 0;
|
||||
if (!hasclass)
|
||||
device_set_devclass(child, NULL);
|
||||
(void)device_set_devclass(child, NULL);
|
||||
|
||||
/*
|
||||
* If the driver returns SUCCESS, there can be
|
||||
@ -2050,7 +2053,7 @@ device_probe_child(device_t dev, device_t child)
|
||||
* certainly doesn't match.
|
||||
*/
|
||||
if (result > 0) {
|
||||
device_set_driver(child, NULL);
|
||||
(void)device_set_driver(child, NULL);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -2113,7 +2116,9 @@ device_probe_child(device_t dev, device_t child)
|
||||
if (result != 0)
|
||||
return (result);
|
||||
}
|
||||
device_set_driver(child, best->driver);
|
||||
result = device_set_driver(child, best->driver);
|
||||
if (result != 0)
|
||||
return (result);
|
||||
resource_int_value(best->driver->name, child->unit,
|
||||
"flags", &child->devflags);
|
||||
|
||||
@ -2722,8 +2727,8 @@ device_attach(device_t dev)
|
||||
dev->driver->name, dev->unit, error);
|
||||
/* Unset the class; set in device_probe_child */
|
||||
if (dev->devclass == NULL)
|
||||
device_set_devclass(dev, NULL);
|
||||
device_set_driver(dev, NULL);
|
||||
(void)device_set_devclass(dev, NULL);
|
||||
(void)device_set_driver(dev, NULL);
|
||||
device_sysctl_fini(dev);
|
||||
dev->state = DS_NOTPRESENT;
|
||||
return (error);
|
||||
@ -2776,7 +2781,7 @@ device_detach(device_t dev)
|
||||
devclass_delete_device(dev->devclass, dev);
|
||||
|
||||
dev->state = DS_NOTPRESENT;
|
||||
device_set_driver(dev, NULL);
|
||||
(void)device_set_driver(dev, NULL);
|
||||
device_set_desc(dev, NULL);
|
||||
device_sysctl_fini(dev);
|
||||
|
||||
@ -4613,7 +4618,6 @@ print_driver(driver_t *driver, int indent)
|
||||
print_driver_short(driver, indent);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
print_driver_list(driver_list_t drivers, int indent)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user