| From a84a79e4d369a73c0130b5858199e949432da4c6 Mon Sep 17 00:00:00 2001 |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| Date: Mon, 17 Oct 2011 08:24:24 -0700 |
| Subject: Avoid using variable-length arrays in kernel/sys.c |
| |
| From: Linus Torvalds <torvalds@linux-foundation.org> |
| |
| commit a84a79e4d369a73c0130b5858199e949432da4c6 upstream. |
| |
| The size is always valid, but variable-length arrays generate worse code |
| for no good reason (unless the function happens to be inlined and the |
| compiler sees the length for the simple constant it is). |
| |
| Also, there seems to be some code generation problem on POWER, where |
| Henrik Bakken reports that register r28 can get corrupted under some |
| subtle circumstances (interrupt happening at the wrong time?). That all |
| indicates some seriously broken compiler issues, but since variable |
| length arrays are bad regardless, there's little point in trying to |
| chase it down. |
| |
| "Just don't do that, then". |
| |
| Reported-by: Henrik Grindal Bakken <henribak@cisco.com> |
| Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| kernel/sys.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/kernel/sys.c |
| +++ b/kernel/sys.c |
| @@ -1135,7 +1135,7 @@ DECLARE_RWSEM(uts_sem); |
| static int override_release(char __user *release, int len) |
| { |
| int ret = 0; |
| - char buf[len]; |
| + char buf[65]; |
| |
| if (current->personality & UNAME26) { |
| char *rest = UTS_RELEASE; |