|
@@ -206,7 +206,19 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)
|
|
|
return -EINVAL;
|
|
|
if (copy_from_user(&tv, optval, sizeof(tv)))
|
|
|
return -EFAULT;
|
|
|
-
|
|
|
+ if (tv.tv_usec < 0 || tv.tv_usec >= USEC_PER_SEC)
|
|
|
+ return -EDOM;
|
|
|
+
|
|
|
+ if (tv.tv_sec < 0) {
|
|
|
+ static int warned = 0;
|
|
|
+ *timeo_p = 0;
|
|
|
+ if (warned < 10 && net_ratelimit())
|
|
|
+ warned++;
|
|
|
+ printk(KERN_INFO "sock_set_timeout: `%s' (pid %d) "
|
|
|
+ "tries to set negative timeout\n",
|
|
|
+ current->comm, current->pid);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
*timeo_p = MAX_SCHEDULE_TIMEOUT;
|
|
|
if (tv.tv_sec == 0 && tv.tv_usec == 0)
|
|
|
return 0;
|