diff options
author | mjacob <mjacob@FreeBSD.org> | 2001-01-16 07:15:36 +0000 |
---|---|---|
committer | mjacob <mjacob@FreeBSD.org> | 2001-01-16 07:15:36 +0000 |
commit | 546b85a8456a42f91a7a548183f036931e5b3344 (patch) | |
tree | fe0c34f4657618e517cb33ac8edf762e89ce046e /sys/dev/isp | |
parent | ff222c0ba58350a42bf02ccaff04a2428d49df5d (diff) | |
download | FreeBSD-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.c | 13 |
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); } |