--- linux-user/syscall.c +++ linux-user/syscall.c @@ -2727,7 +2727,8 @@ case TARGET_NR_capset: goto unimplemented; case TARGET_NR_sigaltstack: - goto unimplemented; + ret = 0; /* good enough for most purposes */ + break; case TARGET_NR_sendfile: goto unimplemented; #ifdef TARGET_NR_getpmsg --- linux-user/signal.c +++ linux-user/signal.c @@ -1014,6 +1021,14 @@ return err; } +void* hack_stack; + +void hack_handler(int signum) +{ + fprintf(stderr,"QEMU: stack overflow, aborting\n"); + exit(-SIGSEGV); +} + static inline void * get_sigframe(struct emulated_sigaction *ka, CPUState *regs, int framesize) { @@ -1026,6 +1041,19 @@ if ((ka->sa.sa_flags & SA_ONSTACK) && !sas_ss_flags(sp)) sp = current->sas_ss_sp + current->sas_ss_size; #endif + + /* EVIL HACK TIME! + This is supposed to prevent endless segfault loops in case of stack + overflows that can occur as a result of the dummy sigaltstack() + syscall. */ + struct sigaction oldact; + struct sigaction act; + memset(&act,0,sizeof(struct sigaction)); + act.sa_handler=hack_handler; + sigaction(SIGSEGV,&act,&oldact); + hack_stack = *((void**)((sp-framesize)&~7)); + sigaction(SIGSEGV,&oldact,&act); + /* * ATPCS B01 mandates 8-byte alignment */