Ensure target/lun passed from user-level supported on this bus.
Scanning unsupported IDs causes different issues from duplicate
devices to system crash.
This commit is contained in:
Alexander Motin 2009-10-31 09:03:48 +00:00
parent fd66267ffb
commit d521940e9a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=198705

View File

@ -452,7 +452,34 @@ xptioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag, struct thread *td
ccb = xpt_alloc_ccb();
CAM_SIM_LOCK(bus->sim);
/* Ensure passed in target/lun supported on this bus. */
if ((inccb->ccb_h.target_id != CAM_TARGET_WILDCARD) ||
(inccb->ccb_h.target_lun != CAM_LUN_WILDCARD)) {
if (xpt_create_path(&ccb->ccb_h.path,
xpt_periph,
inccb->ccb_h.path_id,
CAM_TARGET_WILDCARD,
CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
error = EINVAL;
CAM_SIM_UNLOCK(bus->sim);
xpt_free_ccb(ccb);
break;
}
xpt_setup_ccb(&ccb->ccb_h, ccb->ccb_h.path,
inccb->ccb_h.pinfo.priority);
ccb->ccb_h.func_code = XPT_PATH_INQ;
xpt_action(ccb);
xpt_free_path(ccb->ccb_h.path);
if ((inccb->ccb_h.target_id != CAM_TARGET_WILDCARD &&
inccb->ccb_h.target_id > ccb->cpi.max_target) ||
(inccb->ccb_h.target_lun != CAM_LUN_WILDCARD &&
inccb->ccb_h.target_lun > ccb->cpi.max_lun)) {
error = EINVAL;
CAM_SIM_UNLOCK(bus->sim);
xpt_free_ccb(ccb);
break;
}
}
/*
* Create a path using the bus, target, and lun the
* user passed in.