Ptrace segfault

Bob Bishop rb at gid.co.uk
Thu Apr 29 22:23:05 UTC 2010


Hi,

On 29 Apr 2010, at 22:37, Garrett Cooper wrote:

> On Thu, Apr 29, 2010 at 12:06 PM, Gunnar Hinriksson <tomtinn at gmail.com> wrote:
>> Hello
>> 
>> Im having a little problem using ptrace on my system.
>> If I use ptrace to attach to another process the child process
>> segfaults once I detach.
>> For example using this simple program.
>> 
>> #include <stdio.h>
>> #include <stdlib.h>
>> #include <sys/types.h>
>> #include <sys/ptrace.h>
>> #include <sys/wait.h>
>> 
>> int main(int argc, char *argv[])
>> {
>>        int pid = atoi(argv[1]);
>>        ptrace(PT_ATTACH, pid, 0, 0);
>>        wait(NULL);
>>        ptrace(PT_DETACH, pid, 0, 0);
>>        return 0;
>> }
>> 
>> Am I using ptrace incorrectly or is there perhaps a bug in ptrace that
>> causes the child to always segfault ?
> 
>    Nope -- it's a bug in your code. From ptrace(2):
> 
>     PT_CONTINUE   The traced process continues execution.  The addr argument
>                   is an address specifying the place where execution is to be
>                   resumed (a new value for the program counter), or
>                   (caddr_t)1 to indicate that execution is to pick up where
>                   it left off.  The data argument provides a signal number to
>                   be delivered to the traced process as it resumes execution,
>                   or 0 if no signal is to be sent.
> 
> [...]
> 
>     PT_DETACH     This request is like PT_CONTINUE, except that it does not
                                                                 ^^^^^^^^^^^
>                   allow specifying an alternate place to continue execution,
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>                   and after it succeeds, the traced process is no longer
>                   traced and continues execution normally.
> 
>    Note very carefully the fact that PT_DETACH is like PT_CONTINUE,
> and that PT_CONTINUE says that addr references the memory where the
> execution is going to be resumed.

Looks to me like a bug in ptrace(PT_DETACH,...) which to agree with ptrace(2) ought either to
(a) fail (EINVAL?) if addr != (caddr_t)1, or
(b) ignore addr entirely; it's not clear which.

OP inferred (b) which is reasonable.

> HTH,
> -Garrett
> _______________________________________________
> freebsd-hackers at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at freebsd.org"
> 
> 


--
Bob Bishop          +44 (0)118 940 1243
rb at gid.co.uk    fax +44 (0)118 940 1295
             mobile +44 (0)783 626 4518







More information about the freebsd-hackers mailing list