• Rabin Vincent's avatar
    CRISv32: prevent bogus restarts on sigreturn · 0f72e5c0
    Rabin Vincent authored
    Al Viro noted that CRIS is vulnerable to bogus restarts on sigreturn.
    
    The fixes CRISv32 by using regs->exs as an additional indicator to
    whether we should attempt to restart the syscall or not.  EXS is only
    used in the sigtrap handling, and in that path we already have r9 (the
    other indicator, which indicates if we're in a syscall or not) cleared.
    
    Test case, a port of Al's ARM version from 653d48b2 ("arm: fix
    really nasty sigreturn bug"):
    
      #include <unistd.h>
      #include <signal.h>
      #include <stdlib.h>
      #include <sys/time.h>
      #include <errno.h>
    
      void f(int n)
      {
      	register int r10 asm ("r10") = n;
    
              __asm__ __volatile__(
      		"ba	1f	\n"
      		"nop		\n"
      		"break	8	\n"
      		"1: ba	.	\n"
      		"nop		\n"
      		:
      		: "r" (r10)
      		: "memory");
      }
    
      void handler1(int sig) { }
      void handler2(int sig) { raise(1); }
      void handler3(int sig) { exit(0); }
    
      int main(int argc, char *argv[])
      {
              struct sigaction s = {.sa_handler = handler2};
              struct itimerval t1 = { .it_value = {1} };
              struct itimerval t2 = { .it_value = {2} };
    
              signal(1, handler1);
    
              sigemptyset(&s.sa_mask);
              sigaddset(&s.sa_mask, 1);
              sigaction(SIGALRM, &s, NULL);
    
              signal(SIGVTALRM, handler3);
    
              setitimer(ITIMER_REAL, &t1, NULL);
              setitimer(ITIMER_VIRTUAL, &t2, NULL);
    
              f(-513); /* -ERESTARTNOINTR */
    
              return 0;
      }
    Reported-by: default avatarAl Viro <viro@ZenIV.linux.org.uk>
    Link: http://lkml.kernel.org/r/20121208074429.GC4939@ZenIV.linux.org.ukSigned-off-by: default avatarRabin Vincent <rabin@rab.in>
    Signed-off-by: default avatarJesper Nilsson <jespern@axis.com>
    0f72e5c0
entry.S 22.6 KB