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

Reply via email to