summaryrefslogtreecommitdiffstats
path: root/sys/cam/scsi/scsi_cd.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2012-06-20 18:25:51 +0000
committermav <mav@FreeBSD.org>2012-06-20 18:25:51 +0000
commit056fd51a2215e8405ed46945b0eb147735753b9b (patch)
tree3ccda12f09a2541549992fa69d72e0840e6021ed /sys/cam/scsi/scsi_cd.c
parent12f0fa63b40da9c91d4058d4a031666755896565 (diff)
downloadFreeBSD-src-056fd51a2215e8405ed46945b0eb147735753b9b.zip
FreeBSD-src-056fd51a2215e8405ed46945b0eb147735753b9b.tar.gz
Check status of cam_periph_hold() inside cdclose(). If cd device was
invalidated while open, cam_periph_hold() will return error and won't get the reference. Following reference release will crash the system. Sponsored by: iXsystems, Inc. MFC after: 3 days
Diffstat (limited to 'sys/cam/scsi/scsi_cd.c')
-rw-r--r--sys/cam/scsi/scsi_cd.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c
index da7b8ea..2d64553 100644
--- a/sys/cam/scsi/scsi_cd.c
+++ b/sys/cam/scsi/scsi_cd.c
@@ -1041,6 +1041,7 @@ cdclose(struct disk *dp)
{
struct cam_periph *periph;
struct cd_softc *softc;
+ int error;
periph = (struct cam_periph *)dp->d_drv1;
if (periph == NULL)
@@ -1049,7 +1050,11 @@ cdclose(struct disk *dp)
softc = (struct cd_softc *)periph->softc;
cam_periph_lock(periph);
- cam_periph_hold(periph, PRIBIO);
+ if ((error = cam_periph_hold(periph, PRIBIO)) != 0) {
+ cam_periph_unlock(periph);
+ cam_periph_release(periph);
+ return (0);
+ }
CAM_DEBUG(periph->path, CAM_DEBUG_TRACE | CAM_DEBUG_PERIPH,
("cdclose\n"));
OpenPOWER on IntegriCloud