summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp
diff options
context:
space:
mode:
authormjacob <mjacob@FreeBSD.org>2001-01-16 07:15:36 +0000
committermjacob <mjacob@FreeBSD.org>2001-01-16 07:15:36 +0000
commit546b85a8456a42f91a7a548183f036931e5b3344 (patch)
treefe0c34f4657618e517cb33ac8edf762e89ce046e /sys/dev/isp
parentff222c0ba58350a42bf02ccaff04a2428d49df5d (diff)
downloadFreeBSD-src-546b85a8456a42f91a7a548183f036931e5b3344.zip
FreeBSD-src-546b85a8456a42f91a7a548183f036931e5b3344.tar.gz
Guard against overflow of the calculated timeout value.
Diffstat (limited to 'sys/dev/isp')
-rw-r--r--sys/dev/isp/isp_freebsd.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c
index 94a56aa..ecf9e71 100644
--- a/sys/dev/isp/isp_freebsd.c
+++ b/sys/dev/isp/isp_freebsd.c
@@ -1502,14 +1502,19 @@ isp_action(struct cam_sim *sim, union ccb *ccb)
case CMD_QUEUED:
ccb->ccb_h.status |= CAM_SIM_QUEUED;
if (ccb->ccb_h.timeout != CAM_TIME_INFINITY) {
- int ticks;
+ u_int64_t ticks = (u_int64_t) hz;
if (ccb->ccb_h.timeout == CAM_TIME_DEFAULT)
- ticks = 60 * 1000 * hz;
+ ticks = 60 * 1000 * ticks;
else
ticks = ccb->ccb_h.timeout * hz;
ticks = ((ticks + 999) / 1000) + hz + hz;
- ccb->ccb_h.timeout_ch =
- timeout(isp_watchdog, (caddr_t)ccb, ticks);
+ if (ticks >= 0x80000000) {
+ isp_prt(isp, ISP_LOGERR,
+ "timeout overflow");
+ ticks = 0x80000000;
+ }
+ ccb->ccb_h.timeout_ch = timeout(isp_watchdog,
+ (caddr_t)ccb, (int)ticks);
} else {
callout_handle_init(&ccb->ccb_h.timeout_ch);
}
OpenPOWER on IntegriCloud