summaryrefslogtreecommitdiffstats
path: root/sys/dev/ipmi
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2006-12-06 15:10:11 +0000
committerjhb <jhb@FreeBSD.org>2006-12-06 15:10:11 +0000
commit16b7f5bc5494c74cd638ca46b3fcfbf6dfd0e4f0 (patch)
treea29ddb9380c952a7c5d3475ba967ee85901d1c8e /sys/dev/ipmi
parentee86f7872a19a9af8c7d540f035fd38ca238ebe6 (diff)
downloadFreeBSD-src-16b7f5bc5494c74cd638ca46b3fcfbf6dfd0e4f0.zip
FreeBSD-src-16b7f5bc5494c74cd638ca46b3fcfbf6dfd0e4f0.tar.gz
Fix some edge cases in detach() as well as a memory leak if we fail to
talk to the BMC. Reported by: Alexander Logvinov : ports at logvinov_com MFC after: 1 week
Diffstat (limited to 'sys/dev/ipmi')
-rw-r--r--sys/dev/ipmi/ipmi.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/dev/ipmi/ipmi.c b/sys/dev/ipmi/ipmi.c
index 389d8d6..194f9d1 100644
--- a/sys/dev/ipmi/ipmi.c
+++ b/sys/dev/ipmi/ipmi.c
@@ -756,18 +756,22 @@ ipmi_startup(void *arg)
error = ipmi_submit_driver_request(sc, req, MAX_TIMEOUT);
if (error == EWOULDBLOCK) {
device_printf(dev, "Timed out waiting for GET_DEVICE_ID\n");
+ ipmi_free_request(req);
return;
} else if (error) {
device_printf(dev, "Failed GET_DEVICE_ID: %d\n", error);
+ ipmi_free_request(req);
return;
} else if (req->ir_compcode != 0) {
device_printf(dev,
"Bad completion code for GET_DEVICE_ID: %d\n",
req->ir_compcode);
+ ipmi_free_request(req);
return;
} else if (req->ir_replylen < 5) {
device_printf(dev, "Short reply for GET_DEVICE_ID: %d\n",
req->ir_replylen);
+ ipmi_free_request(req);
return;
}
@@ -888,14 +892,16 @@ ipmi_detach(device_t dev)
sc->ipmi_cloning = 0;
IPMI_UNLOCK(sc);
- EVENTHANDLER_DEREGISTER(dev_clone, sc->ipmi_clone_tag);
+ if (sc->ipmi_clone_tag)
+ EVENTHANDLER_DEREGISTER(dev_clone, sc->ipmi_clone_tag);
#else
if (sc->ipmi_idev.ipmi_open) {
IPMI_UNLOCK(sc);
return (EBUSY);
}
IPMI_UNLOCK(sc);
- destroy_dev(sc->ipmi_idev.ipmi_cdev);
+ if (sc->ipmi_idev.ipmi_cdev)
+ destroy_dev(sc->ipmi_idev.ipmi_cdev);
#endif
/* Detach from watchdog handling and turn off watchdog. */
OpenPOWER on IntegriCloud