diff options
| author | Mark Wielaard <[email protected]> | 2014-06-11 15:14:23 +0200 |
|---|---|---|
| committer | Mark Wielaard <[email protected]> | 2014-06-11 15:31:41 +0200 |
| commit | 14beac3b6f22b8d7a054980f74c4f8d33b969fc4 (patch) | |
| tree | 829d37f7f338c037c35e82d43fa86e34b1977324 /libdwfl/linux-pid-attach.c | |
| parent | 824f393411acc4596ab557b6e7bff9e48c61f951 (diff) | |
libdwfl: Record dwfl_attach_state error and return it on failure.
When dwfl_attach_state fails functions that need the process state should
return the error that caused the attach to fail. Use this in the backtrace
test to signal any attach failure. This makes sure that architectures that
don't provide unwinder support get properly detected (and the tests SKIPs)
Also don't assert when trying to attach a non-core ELF file, but return an
error to indicate failure.
Signed-off-by: Mark Wielaard <[email protected]>
Diffstat (limited to 'libdwfl/linux-pid-attach.c')
| -rw-r--r-- | libdwfl/linux-pid-attach.c | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c index 8aee7211..d60955e6 100644 --- a/libdwfl/linux-pid-attach.c +++ b/libdwfl/linux-pid-attach.c @@ -290,13 +290,23 @@ dwfl_linux_proc_attach (Dwfl *dwfl, pid_t pid, bool assume_ptrace_stopped) { char buffer[36]; FILE *procfile; + int err = 0; /* The errno to return and set for dwfl->attcherr. */ /* Make sure to report the actual PID (thread group leader) to dwfl_attach_state. */ snprintf (buffer, sizeof (buffer), "/proc/%ld/status", (long) pid); procfile = fopen (buffer, "r"); if (procfile == NULL) - return errno; + { + err = errno; + fail: + if (dwfl->process == NULL && dwfl->attacherr == DWFL_E_NOERROR) + { + errno = err; + dwfl->attacherr = __libdwfl_canon_error (DWFL_E_ERRNO); + } + return err; + } char *line = NULL; size_t linelen = 0; @@ -317,19 +327,26 @@ dwfl_linux_proc_attach (Dwfl *dwfl, pid_t pid, bool assume_ptrace_stopped) fclose (procfile); if (pid == 0) - return ESRCH; + { + err = ESRCH; + goto fail; + } char dirname[64]; int i = snprintf (dirname, sizeof (dirname), "/proc/%ld/task", (long) pid); assert (i > 0 && i < (ssize_t) sizeof (dirname) - 1); DIR *dir = opendir (dirname); if (dir == NULL) - return errno; + { + err = errno; + goto fail; + } struct __libdwfl_pid_arg *pid_arg = malloc (sizeof *pid_arg); if (pid_arg == NULL) { closedir (dir); - return ENOMEM; + err = ENOMEM; + goto fail; } pid_arg->dir = dir; pid_arg->tid_attached = 0; |
