changeset 867:1d5e94400592

4766208 alarm(2) does not work with arguments larger than 2^31/100 on Solaris 2.6 thru Nevada.
author peterte
date Tue, 08 Nov 2005 02:22:36 -0800
parents 08bb8e0ae066
children 09ef7c98db8f
files usr/src/uts/common/syscall/alarm.c
diffstat 1 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/syscall/alarm.c	Mon Nov 07 18:10:17 2005 -0800
+++ b/usr/src/uts/common/syscall/alarm.c	Tue Nov 08 02:22:36 2005 -0800
@@ -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 @@
 		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);