This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFA] Add support for $sdir and $pdir to libthread-db-search-path


Tom> Well, actually, I think the pre-existing code has some problems, but
Tom> they aren't introduced by your patch.  I will clean them up separately.

I am checking this in on the trunk.

This removes PATH_MAX from linux-thread-db.c.  It also fixes the check
for an absolute file name, which was incorrect in the earlier code.

Built and regtested by the buildbot.

Tom

2011-05-18  Tom Tromey  <tromey@redhat.com>

	* linux-thread-db.c (try_thread_db_load_from_pdir_1): Fix absolute
	path check.  Use xmalloc and cleanups.
	(try_thread_db_load_from_dir): Use xmalloc and cleanups.

diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index 179986f..f43efc7 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -819,29 +819,29 @@ try_thread_db_load (const char *library)
 static int
 try_thread_db_load_from_pdir_1 (struct objfile *obj)
 {
-  char path[PATH_MAX], *cp;
+  struct cleanup *cleanup;
+  char *path, *cp;
+  int result;
 
-  gdb_assert (strlen (obj->name) < sizeof (path));
-  strcpy (path, obj->name);
-  cp = strrchr (path, '/');
-
-  if (cp == NULL)
+  if (obj->name[0] != '/')
     {
       warning (_("Expected absolute pathname for libpthread in the"
-		 " inferior, but got %s."), path);
-      return 0;
-    }
-  else if (cp + 1 + strlen (LIBTHREAD_DB_SO) + 1 > path + sizeof (path))
-    {
-      warning (_("Unexpected: path to libpthread in the inferior is"
-		 " too long: %s"), path);
+		 " inferior, but got %s."), obj->name);
       return 0;
     }
-  else
-    {
-      strcpy (cp + 1, LIBTHREAD_DB_SO);
-      return try_thread_db_load (path);
-    }
+
+  path = xmalloc (strlen (obj->name) + 1 + strlen (LIBTHREAD_DB_SO) + 1);
+  cleanup = make_cleanup (xfree, path);
+
+  strcpy (path, obj->name);
+  cp = strrchr (path, '/');
+  /* This should at minimum hit the first character.  */
+  gdb_assert (cp != NULL);
+  strcpy (cp + 1, LIBTHREAD_DB_SO);
+  result = try_thread_db_load (path);
+
+  do_cleanups (cleanup);
+  return result;
 }
 
 /* Handle $pdir in libthread-db-search-path.
@@ -888,24 +888,20 @@ try_thread_db_load_from_sdir (void)
 static int
 try_thread_db_load_from_dir (const char *dir, size_t dir_len)
 {
-  char path[PATH_MAX];
+  struct cleanup *cleanup;
+  char *path;
+  int result;
 
-  if (dir_len + 1 + strlen (LIBTHREAD_DB_SO) + 1 > sizeof (path))
-    {
-      char *cp = xmalloc (dir_len + 1);
-
-      memcpy (cp, dir, dir_len);
-      cp[dir_len] = '\0';
-      warning (_("libthread-db-search-path component too long,"
-		 " ignored: %s."), cp);
-      xfree (cp);
-      return 0;
-    }
+  path = xmalloc (dir_len + 1 + strlen (LIBTHREAD_DB_SO) + 1);
+  cleanup = make_cleanup (xfree, path);
 
   memcpy (path, dir, dir_len);
   path[dir_len] = '/';
   strcpy (path + dir_len + 1, LIBTHREAD_DB_SO);
-  return try_thread_db_load (path);
+  result = try_thread_db_load (path);
+
+  do_cleanups (cleanup);
+  return result;
 }
 
 /* Search libthread_db_search_path for libthread_db which "agrees"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]