diff --git a/kernel/sysctl.c b/kernel/sysctl.c index a6c17d354d9b2508538f4ae71c3ad29e40369e9b..3b9f4698140107825622c11ebc511b5e60859ae4 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -2638,7 +2638,16 @@ static int do_proc_dointvec_minmax_conv(bool *negp, unsigned long *lvalp, { struct do_proc_dointvec_minmax_conv_param *param = data; if (write) { - int val = *negp ? -*lvalp : *lvalp; + int val; + if (*negp) { + if (*lvalp > (unsigned long) INT_MAX + 1) + return -EINVAL; + val = -*lvalp; + } else { + if (*lvalp > (unsigned long) INT_MAX) + return -EINVAL; + val = *lvalp; + } if ((param->min && *param->min > val) || (param->max && *param->max < val)) return -EINVAL;