summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorpeterte <none@none>2005-11-08 02:22:36 -0800
committerpeterte <none@none>2005-11-08 02:22:36 -0800
commit741eb7a687e4b7b07c4e90197184d586da46ed66 (patch)
tree0768cb8216c9065c8e5ba4381c539789ce9bd288 /usr/src
parent07ba041951d9c8107e1fde609b578608d2f08e24 (diff)
downloadillumos-joyent-741eb7a687e4b7b07c4e90197184d586da46ed66.tar.gz
4766208 alarm(2) does not work with arguments larger than 2^31/100 on Solaris 2.6 thru Nevada.
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/syscall/alarm.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/usr/src/uts/common/syscall/alarm.c b/usr/src/uts/common/syscall/alarm.c
index 15027cdd82..87ba1705b1 100644
--- a/usr/src/uts/common/syscall/alarm.c
+++ b/usr/src/uts/common/syscall/alarm.c
@@ -24,8 +24,8 @@
/*
- * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
- * All rights reserved.
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
@@ -80,6 +80,17 @@ alarm(int deltat)
ret = 0;
else
ret = (del + hz - 1) / hz; /* convert to seconds */
+
+ /*
+ * Our implementation defined limit for alarm is
+ * INT_MAX / hz. Anything larger gets truncated
+ * to that limit. If deltat is negative we can
+ * assume a wrap has occurred so peg deltat in
+ * that case too.
+ */
+ if (deltat > (INT_MAX / hz) || deltat < 0)
+ deltat = INT_MAX / hz;
+
if (deltat)
p->p_alarmid = realtime_timeout(sigalarm2proc, p, deltat * hz);
mutex_exit(&p->p_lock);