diff options
author | peterte <none@none> | 2005-11-08 02:22:36 -0800 |
---|---|---|
committer | peterte <none@none> | 2005-11-08 02:22:36 -0800 |
commit | 741eb7a687e4b7b07c4e90197184d586da46ed66 (patch) | |
tree | 0768cb8216c9065c8e5ba4381c539789ce9bd288 /usr/src | |
parent | 07ba041951d9c8107e1fde609b578608d2f08e24 (diff) | |
download | illumos-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.c | 15 |
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); |