From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753695AbbGKHjs (ORCPT ); Sat, 11 Jul 2015 03:39:48 -0400 Received: from smtp03.srv.cs.cmu.edu ([128.2.217.202]:64115 "EHLO smtp03.srv.cs.cmu.edu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752317AbbGKHjq (ORCPT ); Sat, 11 Jul 2015 03:39:46 -0400 From: Robert Xiao To: "LKML ; Mikulas Patocka ; Ilya Dryomov" Cc: Robert Xiao Subject: [PATCH] sysctl: Fix conversion of INT_MIN for LP64 systems Date: Fri, 10 Jul 2015 23:56:52 -0700 Message-Id: <20150711065652.18270.87751@bawang.local> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On LP64 systems, reading a sysctl file containing an INT_MIN (-2147483648) could incorrectly show -18446744071562067968 due to an incorrect conversion in do_proc_dointvec_conv. This patch fixes the edge case by converting to unsigned int first to avoid sign extending INT_MIN to unsigned long. Test: root:/proc/sys/kernel# echo -2147483648 0 0 0 > printk root:/proc/sys/kernel# cat printk Without patch, produces -18446744071562067968 0 0 0. With patch, should produce -2147483648 0 0 0. Signed-off-by: Robert Xiao --- kernel/sysctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 19b62b5..464df36 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -1995,10 +1995,10 @@ static int do_proc_dointvec_conv(bool *negp, unsigned long *lvalp, int val = *valp; if (val < 0) { *negp = true; - *lvalp = (unsigned long)-val; + *lvalp = (unsigned int)-val; } else { *negp = false; - *lvalp = (unsigned long)val; + *lvalp = (unsigned int)val; } } return 0; -- 2.2.2