Found because 'stress-ng --priv-instr ...' hangs and then requires '/bin/kill --force ...':

Testcase with
  [PATCH v2] Cygwin: signal: Copy context to alternate stack in the SA_ONSTACK case
already applied:

$ uname -r
3.7.0-dev-16-g2ef1a37e7823-dirty.x86_64

$ cat loopsigill.c
#include <setjmp.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>

static volatile sig_atomic_t sigcnt;
static sigjmp_buf sjb;

static void sighandler(int sig)
{
  (void)sig;
  ++sigcnt;
  siglongjmp(sjb, 1);
  write(1, "[FAIL]\n", 7);
}

int main()
{
  signal(SIGILL, sighandler);
  printf("pid=%d\n", (int)getpid());

  while (sigsetjmp(sjb, 1))
    ;

  // loop:
  if (sigcnt < 10 || !(sigcnt % 1000))
    printf("%06d\n", sigcnt);
  if (sigcnt >= 100000)
      return 42;
  asm volatile ("invd"); // goto loop;

  return 13; // NOT REACHED
}

$ gcc -o loopsigill loopsigill.c

$ ./loopsigill # may succeed ...
pid=122
000000
000001
...
099000
100000

$ echo $?
42

$ ./loopsigill # ... or crash silently ...
pid=130
000000
000001
...
026000
027000

$ echo $?
0

$ ./loopsigill # ... or hang
pid=135
000000
000001
...
037000
038000
[requires '/bin/kill --force ...']

$ strace -o trace.log ./loopsigill # run '/bin/kill --force ...' ASAP!
pid=142
000000
[always hangs after first signal and fills trace.log quickly]

$ less trace.log
...
   25   25501 [main] loopsigill 142 write: 7 = write(1, 0xA00017710, 7)
--- Process 6856 (pid: 142), exception c0000096 at 00000001004011b9
  142   25643 [main] loopsigill 142 exception::handle: In cygwin_except_handler exception 0xC0000096 at 0x1004011B9 sp 0x7FFFFCBE0    26   25669 [main] loopsigill 142 exception::handle: In cygwin_except_handler signal 4 at 0x1004011B9
   38   25707 [main] loopsigill 142 break_here: break here
--- Process 6856 (pid: 142), exception c0000096 at 00000001004011b9
--- Process 6856 (pid: 142), exception c0000096 at 00000001004011b9
... likely repeated until disk is full or time_t wraps around...
--- Process 6856 (pid: 142), exception c0000096 at 00000001004011b9


Problem also occurs
- without the mentioned patch,
- with get/setcontext() instead of sig*jmp(),
- with nullptr access and SIGSEGV handler,
- with Cygwin 3.5.7-1.

I agree that this is not a common use case :-)

--
Regards,
Christian


--
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

Reply via email to