• Waiman Long's avatar
    x86/mm/fault: Allow stack access below %rsp · 1d8ca3be
    Waiman Long authored
    The current x86 page fault handler allows stack access below the stack
    pointer if it is no more than 64k+256 bytes. Any access beyond the 64k+
    limit will cause a segmentation fault.
    
    The gcc -fstack-check option generates code to probe the stack for
    large stack allocation to see if the stack is accessible. The newer gcc
    does that while updating the %rsp simultaneously. Older gcc's like gcc4
    doesn't do that. As a result, an application compiled with an old gcc
    and the -fstack-check option may fail to start at all:
    
      $ cat test.c
      int main() {
    	char tmp[1024*128];
    	printf("### ok\n");
    	return 0;
      }
    
      $ gcc -fstack-check -g -o test test.c
    
      $ ./test
      Segmentation fault
    
    The old binary was working in older kernels where expand_stack() was
    somehow called before the check. But it is not working in newer kernels.
    Besides, the 64k+ limit check is kind of crude and will not catch a
    lot of mistakes that userspace applications may be misbehaving anyway.
    I think the kernel isn't the right place for this kind of tests. We
    should leave it to userspace instrumentation tools to perform them.
    
    The 64k+ limit check is now removed to just let expand_stack() decide
    if a segmentation fault should happen, when the RLIMIT_STACK limit is
    exceeded, for example.
    Signed-off-by: default avatarWaiman Long <longman@redhat.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Rik van Riel <riel@surriel.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/1541535149-31963-1-git-send-email-longman@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    1d8ca3be
fault.c 38.6 KB