On Sun, 21 Nov 2004, Davide Libenzi wrote:
I'd agree with Linus here. A signal handler is part of the application, so it should be single stepped in the same way other application code does. My original patch simply reenabled the flag before returning to userspace, and this had the consequence to single step into signal handlers too.
Hmmm.. I think I may have a test-case for the problem.
Lookie here:
#include <signal.h> #include <sys/mman.h>
void function(void) { printf("Copy protected: ok\n"); }
void handler(int signo) { extern char smc; smc++; }
#define TF 0x100
int main(int argc, char **argv) { void (*fnp)(void);
signal(SIGTRAP, handler); mprotect((void *)(0xfffff000 & (unsigned long)main), 4096, PROT_READ | PROT_WRITE); asm volatile("pushfl ; orl %0,(%%esp) ; popfl" : :"i" (TF):"memory"); asm volatile("pushfl ; andl %0,(%%esp) ; popfl" : :"i" (~TF):"memory"); asm volatile("\nsmc:\n\t" ".byte 0xb7\n\t" ".long function" :"=d" (fnp)); fnp(); exit(1); }
Compile it, run it, and it should say
Copy protected: ok
Now, try to "strace" it, or debug it with gdb, and see if you can repeat the behaviour.
Roland? Think of it as a challenge,
Linus