Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751955AbdFPP7M (ORCPT ); Fri, 16 Jun 2017 11:59:12 -0400 Received: from hera.aquilenet.fr ([141.255.128.1]:42888 "EHLO hera.aquilenet.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750750AbdFPP7J (ORCPT ); Fri, 16 Jun 2017 11:59:09 -0400 Date: Fri, 16 Jun 2017 17:58:59 +0200 From: Samuel Thibault To: Arnd Bergmann Cc: Greg Kroah-Hartman , Andrew Morton , kasan-dev , Dmitry Vyukov , Alexander Potapenko , Andrey Ryabinin , Networking , Linux Kernel Mailing List , Arend van Spriel , Jiri Slaby , Dmitry Torokhov Subject: Re: [PATCH v2 03/11] tty: kbd: reduce stack size with KASAN Message-ID: <20170616155859.gn2einuermlncaku@var.youpi.perso.aquilenet.fr> Mail-Followup-To: Samuel Thibault , Arnd Bergmann , Greg Kroah-Hartman , Andrew Morton , kasan-dev , Dmitry Vyukov , Alexander Potapenko , Andrey Ryabinin , Networking , Linux Kernel Mailing List , Arend van Spriel , Jiri Slaby , Dmitry Torokhov References: <20170614211556.2062728-1-arnd@arndb.de> <20170614211556.2062728-4-arnd@arndb.de> <20170615045221.GA26687@kroah.com> <20170615045347.GA26913@kroah.com> <20170616130215.GC31057@kroah.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Organization: I am not organized User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1392 Lines: 39 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. > > 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