Re: [PATCH v2 03/11] tty: kbd: reduce stack size with KASAN
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: 2017-06-16 15:59:12
Also in:
lkml
Arnd Bergmann, on ven. 16 juin 2017 17:41:47 +0200, wrote:
The problem are the 'ch' and 'flag' variables that are passed into tty_insert_flip_char by value, and from there into tty_insert_flip_string_flags by reference. In this case, kasan tries to detect whether tty_insert_flip_string_flags() does any out-of-bounds access on the pointers and adds 64 bytes redzone around each of the two variables.
Ouch.
gcc-6.3.1 happens to inline 16 calls of tty_insert_flip_char() into kbd_keycode(), so the stack size grows from 168 bytes to 168+(16*2*64) = 2216 bytes. There are 10 calls to put_queue() in to_utf8(), 12 in emulate_raw() and another 4 in kbd_keycode() itself.
That's why I agreed for put_queue :)
I'm however afraid we'd have to mark a lot of static functions that way,
depending on the aggressivity of gcc... I'd indeed really argue that gcc
should consider stack usage when inlining.
static int f(int foo) {
char c[256];
g(c, foo);
}
is really not something that I'd want to see the compiler to inline.
quoted
And no, we shouldn't need to do this. It sounds like ksan is the problem here...Of course kasan is the problem, but it really just does whatever we asked it to do, and cannot do any better as long as we inline many copies of tty_insert_flip_char() into kbd_keycode().
We didn't ask to inline put_queue into kbd_keycode. Samuel