• Roland McGrath's avatar
    x86-64: fix int $0x80 -ENOSYS return · c09249f8
    Roland McGrath authored
    One of my past fixes to this code introduced a different new bug.
    When using 32-bit "int $0x80" entry for a bogus syscall number,
    the return value is not correctly set to -ENOSYS.  This only happens
    when neither syscall-audit nor syscall tracing is enabled (i.e., never
    seen if auditd ever started).  Test program:
    
    	/* gcc -o int80-badsys -m32 -g int80-badsys.c
    	   Run on x86-64 kernel.
    	   Note to reproduce the bug you need auditd never to have started.  */
    
    	#include <errno.h>
    	#include <stdio.h>
    
    	int
    	main (void)
    	{
    	  long res;
    	  asm ("int $0x80" : "=a" (res) : "0" (99999));
    	  printf ("bad syscall returns %ld\n", res);
    	  return res != -ENOSYS;
    	}
    
    The fix makes the int $0x80 path match the sysenter and syscall paths.
    Reported-by: default avatarDmitry V. Levin <ldv@altlinux.org>
    Signed-off-by: default avatarRoland McGrath <roland@redhat.com>
    c09249f8
ia32entry.S 21.6 KB