Skip to content

Commit 196748a

Browse files
Paul Durrantjgross1
authored andcommitted
xen/xenbus: reference count registered modules
To prevent a PV driver module being removed whilst attached to its other end, and hence xenbus calling into potentially invalid text, take a reference on the module before calling the probe() method (dropping it if unsuccessful) and drop the reference after returning from the remove() method. Suggested-by: Jan Beulich <[email protected]> Signed-off-by: Paul Durrant <[email protected]> Reviewed-by: Jan Beulich <[email protected]> Reviewed-by: Juergen Gross <[email protected]> Signed-off-by: Juergen Gross <[email protected]>
1 parent b3f7931 commit 196748a

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

drivers/xen/xenbus/xenbus_probe.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,16 @@ int xenbus_dev_probe(struct device *_dev)
232232
return err;
233233
}
234234

235+
if (!try_module_get(drv->driver.owner)) {
236+
dev_warn(&dev->dev, "failed to acquire module reference on '%s'\n",
237+
drv->driver.name);
238+
err = -ESRCH;
239+
goto fail;
240+
}
241+
235242
err = drv->probe(dev, id);
236243
if (err)
237-
goto fail;
244+
goto fail_put;
238245

239246
err = watch_otherend(dev);
240247
if (err) {
@@ -244,6 +251,8 @@ int xenbus_dev_probe(struct device *_dev)
244251
}
245252

246253
return 0;
254+
fail_put:
255+
module_put(drv->driver.owner);
247256
fail:
248257
xenbus_dev_error(dev, err, "xenbus_dev_probe on %s", dev->nodename);
249258
xenbus_switch_state(dev, XenbusStateClosed);
@@ -263,6 +272,8 @@ int xenbus_dev_remove(struct device *_dev)
263272
if (drv->remove)
264273
drv->remove(dev);
265274

275+
module_put(drv->driver.owner);
276+
266277
free_otherend_details(dev);
267278

268279
xenbus_switch_state(dev, XenbusStateClosed);

0 commit comments

Comments
 (0)