aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog13
-rw-r--r--gdb/darwin-nat.c18
-rw-r--r--gdb/fork-child.c25
-rw-r--r--gdb/gnu-nat.c2
-rw-r--r--gdb/inf-ptrace.c3
-rw-r--r--gdb/inferior.h14
6 files changed, 67 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 4727433..cf68c7e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,16 @@
+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.
+
2017-02-15 Sergio Durigan Junior <sergiodj@redhat.com>
PR gdb/21164
diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c
index 8c5e8a0..edee1be 100644
--- a/gdb/darwin-nat.c
+++ b/gdb/darwin-nat.c
@@ -1729,22 +1729,28 @@ darwin_ptrace_me (void)
char c;
/* Close write end point. */
- close (ptrace_fds[1]);
+ if (close (ptrace_fds[1]) < 0)
+ trace_start_error_with_name ("close");
/* Wait until gdb is ready. */
res = read (ptrace_fds[0], &c, 1);
if (res != 0)
- error (_("unable to read from pipe, read returned: %d"), res);
- close (ptrace_fds[0]);
+ trace_start_error (_("unable to read from pipe, read returned: %d"), res);
+
+ if (close (ptrace_fds[0]) < 0)
+ trace_start_error_with_name ("close");
/* Get rid of privileges. */
- setegid (getgid ());
+ if (setegid (getgid ()) < 0)
+ trace_start_error_with_name ("setegid");
/* Set TRACEME. */
- PTRACE (PT_TRACE_ME, 0, 0, 0);
+ if (PTRACE (PT_TRACE_ME, 0, 0, 0) < 0)
+ trace_start_error_with_name ("PTRACE");
/* Redirect signals to exception port. */
- PTRACE (PT_SIGEXC, 0, 0, 0);
+ if (PTRACE (PT_SIGEXC, 0, 0, 0) < 0)
+ trace_start_error_with_name ("PTRACE");
}
/* Dummy function to be sure fork_inferior uses fork(2) and not vfork(2). */
diff --git a/gdb/fork-child.c b/gdb/fork-child.c
index eaa8cb5..f6256fb 100644
--- a/gdb/fork-child.c
+++ b/gdb/fork-child.c
@@ -109,6 +109,31 @@ escape_bang_in_quoted_argument (const char *shell_file)
return 0;
}
+/* See inferior.h. */
+
+void
+trace_start_error (const char *fmt, ...)
+{
+ va_list ap;
+
+ va_start (ap, fmt);
+ fprintf_unfiltered (gdb_stderr, "Could not trace the inferior "
+ "process.\nError: ");
+ vfprintf_unfiltered (gdb_stderr, fmt, ap);
+ va_end (args);
+
+ gdb_flush (gdb_stderr);
+ _exit (0177);
+}
+
+/* See inferior.h. */
+
+void
+trace_start_error_with_name (const char *string)
+{
+ trace_start_error ("%s: %s", string, safe_strerror (errno));
+}
+
/* Start an inferior Unix child process and sets inferior_ptid to its
pid. EXEC_FILE is the file to run. ALLARGS is a string containing
the arguments to the program. ENV is the environment vector to
diff --git a/gdb/gnu-nat.c b/gdb/gnu-nat.c
index 9935dcb..7efb3c1 100644
--- a/gdb/gnu-nat.c
+++ b/gdb/gnu-nat.c
@@ -2126,7 +2126,7 @@ gnu_ptrace_me (void)
struct inf *inf = cur_inf ();
inf_debug (inf, "tracing self");
if (ptrace (PTRACE_TRACEME) != 0)
- error (_("ptrace (PTRACE_TRACEME) failed!"));
+ trace_start_error_with_name ("ptrace");
}
static void
diff --git a/gdb/inf-ptrace.c b/gdb/inf-ptrace.c
index f61bfe7..21578742 100644
--- a/gdb/inf-ptrace.c
+++ b/gdb/inf-ptrace.c
@@ -79,7 +79,8 @@ static void
inf_ptrace_me (void)
{
/* "Trace me, Dr. Memory!" */
- ptrace (PT_TRACE_ME, 0, (PTRACE_TYPE_ARG3)0, 0);
+ if (ptrace (PT_TRACE_ME, 0, (PTRACE_TYPE_ARG3) 0, 0) < 0)
+ trace_start_error_with_name ("ptrace");
}
/* Start a new inferior Unix child process. EXEC_FILE is the file to
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 *,