diff options
author | BP, Praveen <praveenbp@ti.com> | 2006-12-06 23:39:09 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-07 11:39:42 -0500 |
commit | bd9b0bac6f601655044fc35978e26231dffee03e (patch) | |
tree | b6cc16149e406704e1e124aa159671beb63b7a56 /kernel/sysctl.c | |
parent | 36499dc2bc8025bc931a0fb22bbe0ac0e46ffb14 (diff) |
[PATCH] sysctl: string length calculated is wrong if it contains negative numbers
In the functions do_proc_dointvec() and do_proc_doulongvec_minmax(),
there seems to be a bug in string length calculation if string contains
negative integer.
The console log given below explains the bug. Setting negative values
may not be a right thing to do for "console log level" but then the test
(given below) can be used to demonstrate the bug in the code.
# echo "-1 -1 -1 -123456" > /proc/sys/kernel/printk
# cat /proc/sys/kernel/printk
-1 -1 -1 -1234
#
# echo "-1 -1 -1 123456" > /proc/sys/kernel/printk
# cat /proc/sys/kernel/printk
-1 -1 -1 1234
#
(akpm: the bug is that 123456 gets truncated)
It works as expected if string contains all +ve integers
# echo "1 2 3 4" > /proc/sys/kernel/printk
# cat /proc/sys/kernel/printk
1 2 3 4
#
The patch given below fixes the issue.
Signed-off-by: Praveen BP <praveenbp@ti.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'kernel/sysctl.c')
-rw-r--r-- | kernel/sysctl.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 7abe9704e75a..6d7147cf66bb 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -1875,7 +1875,7 @@ static int __do_proc_dointvec(void *tbl_data, ctl_table *table, | |||
1875 | p = buf; | 1875 | p = buf; |
1876 | if (*p == '-' && left > 1) { | 1876 | if (*p == '-' && left > 1) { |
1877 | neg = 1; | 1877 | neg = 1; |
1878 | left--, p++; | 1878 | p++; |
1879 | } | 1879 | } |
1880 | if (*p < '0' || *p > '9') | 1880 | if (*p < '0' || *p > '9') |
1881 | break; | 1881 | break; |
@@ -2126,7 +2126,7 @@ static int __do_proc_doulongvec_minmax(void *data, ctl_table *table, int write, | |||
2126 | p = buf; | 2126 | p = buf; |
2127 | if (*p == '-' && left > 1) { | 2127 | if (*p == '-' && left > 1) { |
2128 | neg = 1; | 2128 | neg = 1; |
2129 | left--, p++; | 2129 | p++; |
2130 | } | 2130 | } |
2131 | if (*p < '0' || *p > '9') | 2131 | if (*p < '0' || *p > '9') |
2132 | break; | 2132 | break; |