| Jeroen Demeyer on Thu, 22 Feb 2018 16:10:06 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: mfinit --> Illegal instruction: 4 |
On this system:Darwin osx 17.4.0 Darwin Kernel Version 17.4.0: Sun Dec 17 09:19:54 PST 2017; root:xnu-4570.41.2~1/RELEASE_X86_64 x86_64
In some other application I am seeing a SIGILL when the stack overflows after setting up sigaltstack and then forking. This looks like an OS X bug which might relate to this reported PARI/GP crash.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>
static void handler(int sig)
{
fprintf(stderr, "got signal %i\n", sig);
fflush(stderr);
_exit(0);
}
volatile int yes;
static void stack_overflow(void)
{
yes = 1;
if (yes) stack_overflow();
if (yes) stack_overflow();
}
int main(int argc, char** argv)
{
static char alt_stack_space[1 << 16];
stack_t ss;
ss.ss_sp = alt_stack_space;
ss.ss_size = sizeof(alt_stack_space);
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL)) {perror("sigaltstack"); exit(1);}
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_ONSTACK;
if (sigaction(SIGSEGV, &sa, NULL)) {perror("sigaction"); exit(1);}
if (sigaction(SIGBUS, &sa, NULL)) {perror("sigaction"); exit(1);}
if (sigaction(SIGILL, &sa, NULL)) {perror("sigaction"); exit(1);}
pid_t child = fork();
if (!child)
{
/* Child process */
stack_overflow();
}
int status;
if (wait(&status) != child) {fputs("wait() did not return child\n", stderr); exit(1);}
printf("status = %i\n", status);
return 0;
}