diff options
author | Sergio Durigan Junior <sergiodj@redhat.com> | 2017-02-14 18:27:23 -0500 |
---|---|---|
committer | Sergio Durigan Junior <sergiodj@redhat.com> | 2017-02-20 07:48:44 -0500 |
commit | 0db8980cc0ee05727c11f8b7c6674137a4d5de4e (patch) | |
tree | bfbdd67b9e700284dfe4a94e47cbcd1af790d6d5 /gdb/inferior.h | |
parent | 246b91226bbc60bf3b2a4e1a65edc0c577e487c0 (diff) | |
download | gdb-0db8980cc0ee05727c11f8b7c6674137a4d5de4e.zip gdb-0db8980cc0ee05727c11f8b7c6674137a4d5de4e.tar.gz gdb-0db8980cc0ee05727c11f8b7c6674137a4d5de4e.tar.bz2 |
PR gdb/16188: Verify PTRACE_TRACEME succeeded
This patch fixes PR gdb/16188, which is about the fact that
fork_inferior doesn't verify the return value of the "traceme_fun"
callback. On most targets, this callback is actually a wrapper to a
ptrace call that does a PTRACE_TRACEME on the forked GDB process that
will eventually become the inferior.
Thanks to Pedro, this second version of the patch is simpler and more
more logical. Basically, two helper functions are added:
trace_start_error and trace_start_error_with_name. The former can be
used when there is a customized error message to be printed to the
user. The latter works like perror_with_name, so you just need to
pass the function that error'd.
Both helper functions mentioned above do basically the same thing:
print the error message to stderr and call _exit, properly terminating
the forked inferior.
Most of the patch takes care of guarding the necessary system calls
against errors on the "traceme_fun" callbacks. It is not right to
call error on these situations, so I've replaced these calls with the
proper helper function call.
Regression-tested on BuildBot.
Thanks,
gdb/ChangeLog:
2017-02-20 Sergio Durigan Junior <sergiodj@redhat.com>
Pedro Alves <palves@redhat.com>
PR gdb/16188
* darwin-nat.c (darwin_ptrace_me): Check if calls to system
calls succeeded.
* fork-child.c (trace_start_error): New function.
(trace_start_error_with_name): Likewise.
* gnu-nat.c (gnu_ptrace_me): Check if call to PTRACE succeeded.
* inf-ptrace.c (inf_ptrace_me): Likewise.
* inferior.h (trace_start_error): New prototype.
(trace_start_error_with_name): Likewise.
Diffstat (limited to 'gdb/inferior.h')
-rw-r--r-- | gdb/inferior.h | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/gdb/inferior.h b/gdb/inferior.h index 258cc29..7c0ddf3 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -132,6 +132,20 @@ extern void child_terminal_init_with_pgrp (int pgrp); /* From fork-child.c */ +/* Report an error that happened when starting to trace the inferior + (i.e., when the "traceme_fun" callback is called on fork_inferior) + and bail out. This function does not return. */ + +extern void trace_start_error (const char *fmt, ...) + ATTRIBUTE_NORETURN; + +/* Like "trace_start_error", but the error message is constructed by + combining STRING with the system error message for errno. This + function does not return. */ + +extern void trace_start_error_with_name (const char *string) + ATTRIBUTE_NORETURN; + extern int fork_inferior (char *, char *, char **, void (*)(void), void (*)(int), void (*)(void), char *, |