patch-2.2.0-pre7 linux/fs/select.c
Next file: linux/fs/ufs/namei.c
Previous file: linux/fs/proc/root.c
Back to the patch index
Back to the overall index
-  Lines: 29
-  Date:
Sun Jan 10 10:22:34 1999
-  Orig file: 
v2.2.0-pre6/linux/fs/select.c
-  Orig date: 
Fri Nov 27 13:09:28 1998
diff -u --recursive --new-file v2.2.0-pre6/linux/fs/select.c linux/fs/select.c
@@ -221,6 +221,10 @@
 		    || (ret = __get_user(usec, &tvp->tv_usec)))
 			goto out_nofds;
 
+		ret = -EINVAL;
+		if (sec < 0 || usec < 0)
+			goto out_nofds;
+
 		if ((unsigned long) sec < MAX_SELECT_SECONDS) {
 			timeout = ROUND_UP(usec, 1000000/HZ);
 			timeout += sec * (unsigned long) HZ;
@@ -331,10 +335,13 @@
 	if (nfds > NR_OPEN)
 		goto out;
 
-	if (timeout < 0)
-		timeout = MAX_SCHEDULE_TIMEOUT;
-	else if (timeout)
-		timeout = (timeout*HZ+999)/1000+1;
+	if (timeout) {
+		/* Carefula about overflow in the intermediate values */
+		if ((unsigned long) timeout < MAX_SCHEDULE_TIMEOUT / HZ)
+			timeout = (timeout*HZ+999)/1000+1;
+		else /* Negative or overflow */
+			timeout = MAX_SCHEDULE_TIMEOUT;
+	}
 
 	err = -ENOMEM;
 	if (timeout) {
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov