[0/1] Fix internal warning when "gdb -p xxx"

Message ID 532A6018.7090603@mentor.com
State Committed
Headers

Commit Message

Hui Zhu March 20, 2014, 3:27 a.m. UTC
  On 03/20/14 10:58, Hui Zhu wrote:
> On 03/19/14 18:16, Pedro Alves wrote:
>> On 03/19/2014 03:57 AM, Hui Zhu wrote:
>>>>>
>>>>> Same with the nul termination.  The most standard solution is:
>>>>>
>>>>>     static char buf[PATH_MAX];
>>>>>     char name[PATH_MAX];
>>>>>     ssize_t len;
>>>>>
>>>>>     xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
>>>>>     len = readlink (name, buf, PATH_MAX - 1);
>>>>>     if (len != -1)
>>>>>       {
>>>>>         buf[len] = '\0';
>>>>>         return buf;
>>>>>       }
>>>>>     return NULL;
>>>>>
>>> I make a new patch according to your comments.
>>> Please help me review it.
>>
>> The patch changes the bsd implementations's behavior, because
>> you made them return the /proc path when readlink fails (like
>> the Linux version does), instead of what the current code does
>> or what I suggested above.
>>
>
> I made a new version that change fbsd_pid_to_exec_file and nbsd_pid_to_exec_file
> to your suggested above.
>
> Please help me review it.
>
> Thanks,
> Hui
>

I am sorry that I post a wrong version patch that use "size_t len".
I post a new version that fixed this issue.

Thanks,
Hui

2014-03-20  Hui Zhu  <hui@codesourcery.com>
	    Pedro Alves  <palves@redhat.com>

	* darwin-nat.c (darwin_pid_to_exec_file): Change xmalloc to
	static buffer.
	* fbsd-nat.c (fbsd_pid_to_exec_file): Ditto.
	* linux-nat.c (linux_child_pid_to_exec_file): Ditto.
	* nbsd-nat.c (nbsd_pid_to_exec_file): Ditto.
  

Comments

Pedro Alves March 20, 2014, 11 a.m. UTC | #1
On 03/20/2014 03:27 AM, Hui Zhu wrote:

> 2014-03-20  Hui Zhu  <hui@codesourcery.com>
> 	    Pedro Alves  <palves@redhat.com>
> 
> 	* darwin-nat.c (darwin_pid_to_exec_file): Change xmalloc to
> 	static buffer.
> 	* fbsd-nat.c (fbsd_pid_to_exec_file): Ditto.
> 	* linux-nat.c (linux_child_pid_to_exec_file): Ditto.
> 	* nbsd-nat.c (nbsd_pid_to_exec_file): Ditto.

OK, thanks.
  
Hui Zhu March 21, 2014, 3:13 a.m. UTC | #2
On 03/20/14 19:00, Pedro Alves wrote:
> On 03/20/2014 03:27 AM, Hui Zhu wrote:
>
>> 2014-03-20  Hui Zhu  <hui@codesourcery.com>
>> 	    Pedro Alves  <palves@redhat.com>
>>
>> 	* darwin-nat.c (darwin_pid_to_exec_file): Change xmalloc to
>> 	static buffer.
>> 	* fbsd-nat.c (fbsd_pid_to_exec_file): Ditto.
>> 	* linux-nat.c (linux_child_pid_to_exec_file): Ditto.
>> 	* nbsd-nat.c (nbsd_pid_to_exec_file): Ditto.
>
> OK, thanks.
>

Thanks for your help.
Committed to https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=b4ab256ded5020a82ff7ce8dc485e7882fc5b6a7

Best,
Hui
  

Patch

--- a/gdb/darwin-nat.c
+++ b/gdb/darwin-nat.c
@@ -1991,12 +1991,9 @@  set_enable_mach_exceptions (char *args,
  static char *
  darwin_pid_to_exec_file (struct target_ops *self, int pid)
  {
-  char *path;
+  static char path[PATH_MAX];
    int res;
  
-  path = xmalloc (PATH_MAX);
-  make_cleanup (xfree, path);
-
    res = proc_pidinfo (pid, PROC_PIDPATHINFO, 0, path, PATH_MAX);
    if (res >= 0)
      return path;
--- a/gdb/fbsd-nat.c
+++ b/gdb/fbsd-nat.c
@@ -39,9 +39,9 @@ 
  char *
  fbsd_pid_to_exec_file (struct target_ops *self, int pid)
  {
-  size_t len = PATH_MAX;
-  char *buf = xcalloc (len, sizeof (char));
-  char *path;
+  ssize_t len = PATH_MAX;
+  static char buf[PATH_MAX];
+  char name[PATH_MAX];
  
  #ifdef KERN_PROC_PATHNAME
    int mib[4];
@@ -54,15 +54,15 @@  fbsd_pid_to_exec_file (struct target_ops
      return buf;
  #endif
  
-  path = xstrprintf ("/proc/%d/file", pid);
-  if (readlink (path, buf, PATH_MAX - 1) == -1)
+  xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
+  len = readlink (name, buf, PATH_MAX - 1);
+  if (len != -1)
      {
-      xfree (buf);
-      buf = NULL;
+      buf[len] = '\0';
+      return buf;
      }
  
-  xfree (path);
-  return buf;
+  return NULL;
  }
  
  static int
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -4011,19 +4011,15 @@  linux_nat_thread_name (struct target_ops
  static char *
  linux_child_pid_to_exec_file (struct target_ops *self, int pid)
  {
-  char *name1, *name2;
+  static char buf[PATH_MAX];
+  char name[PATH_MAX];
  
-  name1 = xmalloc (PATH_MAX);
-  name2 = xmalloc (PATH_MAX);
-  make_cleanup (xfree, name1);
-  make_cleanup (xfree, name2);
-  memset (name2, 0, PATH_MAX);
+  xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
+  memset (buf, 0, PATH_MAX);
+  if (readlink (name, buf, PATH_MAX - 1) <= 0)
+    strcpy (buf, name);
  
-  xsnprintf (name1, PATH_MAX, "/proc/%d/exe", pid);
-  if (readlink (name1, name2, PATH_MAX - 1) > 0)
-    return name2;
-  else
-    return name1;
+  return buf;
  }
  
  /* Records the thread's register state for the corefile note
--- a/gdb/nbsd-nat.c
+++ b/gdb/nbsd-nat.c
@@ -27,17 +27,17 @@ 
  char *
  nbsd_pid_to_exec_file (struct target_ops *self, int pid)
  {
-  size_t len = PATH_MAX;
-  char *buf = xcalloc (len, sizeof (char));
-  char *path;
+  ssize_t len;
+  static char buf[PATH_MAX];
+  char name[PATH_MAX];
  
-  path = xstrprintf ("/proc/%d/exe", pid);
-  if (readlink (path, buf, PATH_MAX - 1) == -1)
+  xsnprintf (name, PATH_MAX, "/proc/%d/exe", pid);
+  len = readlink (name, buf, PATH_MAX - 1);
+  if (len != -1)
      {
-      xfree (buf);
-      buf = NULL;
+      buf[len] = '\0';
+      return buf;
      }
  
-  xfree (path);
-  return buf;
+  return NULL;
  }