From 68b9939aecfb9a890549e820488812ae566b6aa9 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sun, 1 May 2005 10:06:12 +0000 Subject: [PATCH] * fbsd-nat.c: Include . (fbsd_pid_to_exec_file): Use KERN_PROC_PATHNAME sysctl if available. Plug memory leak. Fixes PR gdb/1922. --- gdb/ChangeLog | 6 ++++++ gdb/fbsd-nat.c | 29 +++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 35479b081bd..c2208572d4c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2005-05-01 Mark Kettenis + + * fbsd-nat.c: Include . + (fbsd_pid_to_exec_file): Use KERN_PROC_PATHNAME sysctl if + available. Plug memory leak. Fixes PR gdb/1922. + 2005-04-29 Mark Kettenis * solist.h (TARGET_SO_FREE_SO, TARGET_SO_CLEAR_SOLIB) diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 2b19f706d49..05d00b5e9c4 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -27,8 +27,9 @@ #include "gdb_assert.h" #include "gdb_string.h" -#include #include +#include +#include #include "elf-bfd.h" #include "fbsd-nat.h" @@ -39,18 +40,30 @@ char * fbsd_pid_to_exec_file (int pid) { + size_t len = MAXPATHLEN; + char *buf = xcalloc (len, sizeof (char)); char *path; - char *buf; - path = xstrprintf ("/proc/%d/file", pid); - buf = xcalloc (MAXPATHLEN, sizeof (char)); - make_cleanup (xfree, path); - make_cleanup (xfree, buf); +#ifdef KERN_PROC_PATHNAME + int mib[4]; - if (readlink (path, buf, MAXPATHLEN) > 0) + mib[0] = CTL_KERN; + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = pid; + if (sysctl (mib, 4, buf, &len, NULL, 0) == 0) return buf; +#endif + + path = xstrprintf ("/proc/%d/file", pid); + if (readlink (path, buf, MAXPATHLEN) == -1) + { + xfree (buf); + buf = NULL; + } - return NULL; + xfree (path); + return buf; } static int -- 2.30.2