diff options
author | John Baldwin <jhb@FreeBSD.org> | 2006-12-06 15:10:11 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2006-12-06 15:10:11 +0000 |
commit | d78cd1ad5538d7ec8f6292706c485bf1b17901ef (patch) | |
tree | a29ddb9380c952a7c5d3475ba967ee85901d1c8e /sys/dev/ipmi/ipmi.c | |
parent | 37716191a8160cf1165faa96759636d4cdb4e8c2 (diff) | |
download | src-d78cd1ad5538d7ec8f6292706c485bf1b17901ef.tar.gz src-d78cd1ad5538d7ec8f6292706c485bf1b17901ef.zip |
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
Notes
Notes:
svn path=/head/; revision=164947
Diffstat (limited to 'sys/dev/ipmi/ipmi.c')
-rw-r--r-- | sys/dev/ipmi/ipmi.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/dev/ipmi/ipmi.c b/sys/dev/ipmi/ipmi.c index 389d8d61cc56..194f9d1ea9a1 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. */ |