]> sourceware.org Git - glibc.git/commitdiff
pldd: Use struct scratch_buffer instead of extend_alloca
authorFlorian Weimer <fweimer@redhat.com>
Wed, 8 Apr 2015 17:11:21 +0000 (19:11 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Wed, 8 Apr 2015 19:06:49 +0000 (21:06 +0200)
ChangeLog
elf/pldd-xx.c
elf/pldd.c

index 7f05d2e9969d6e71e761ec4f800c1ed52da5667f..6bd6303f85f6711e7a7d4830b0d7d1bddb07c023 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-04-08  Florian Weimer  <fweimer@redhat.com>
+
+       * elf/pldd.c (main): Rewrite to use struct
+       scratch_buffer instead of extend_alloca.
+       * elf/pldd-xx.c (find_maps): Likewise.
+
 2015-04-08  Joseph Myers  <joseph@codesourcery.com>
 
        * math/auto-libm-test-in: Add more tests of cbrt.
index d865739853abeda722a4e17f9384edc2cd8f910c..2f1962883c65e85da0bf6e870a69233cbed683e7 100644 (file)
@@ -186,35 +186,43 @@ E(find_maps) (pid_t pid, void *auxv, size_t auxv_size)
   printf ("%lu:\t%s\n", (unsigned long int) pid, exe);
 
   /* Iterate over the list of objects and print the information.  */
-  size_t strsize = 256;
-  char *str = alloca (strsize);
+  struct scratch_buffer tmpbuf;
+  scratch_buffer_init (&tmpbuf);
+  int status = 0;
   do
     {
       struct E(link_map) m;
       if (pread64 (memfd, &m, sizeof (m), list) != sizeof (m))
        {
          error (0, 0, gettext ("cannot read link map"));
-         return EXIT_FAILURE;
+         status = EXIT_FAILURE;
+         goto out;
        }
 
       EW(Addr) name_offset = m.l_name;
     again:
       while (1)
        {
-         ssize_t n = pread64 (memfd, str, strsize, name_offset);
+         ssize_t n = pread64 (memfd, tmpbuf.data, tmpbuf.length, name_offset);
          if (n == -1)
            {
              error (0, 0, gettext ("cannot read object name"));
-             return EXIT_FAILURE;
+             status = EXIT_FAILURE;
+             goto out;
            }
 
-         if (memchr (str, '\0', n) != NULL)
+         if (memchr (tmpbuf.data, '\0', n) != NULL)
            break;
 
-         str = extend_alloca (str, strsize, strsize * 2);
+         if (!scratch_buffer_grow (&tmpbuf))
+           {
+             error (0, 0, gettext ("cannot allocate buffer for object name"));
+             status = EXIT_FAILURE;
+             goto out;
+           }
        }
 
-      if (str[0] == '\0' && name_offset == m.l_name
+      if (((char *)tmpbuf.data)[0] == '\0' && name_offset == m.l_name
          && m.l_libname != 0)
        {
          /* Try the l_libname element.  */
@@ -227,14 +235,16 @@ E(find_maps) (pid_t pid, void *auxv, size_t auxv_size)
        }
 
       /* Skip over the executable.  */
-      if (str[0] != '\0')
-       printf ("%s\n", str);
+      if (((char *)tmpbuf.data)[0] != '\0')
+       printf ("%s\n", (char *)tmpbuf.data);
 
       list = m.l_next;
     }
   while (list != 0);
 
-  return 0;
+ out:
+  scratch_buffer_free (&tmpbuf);
+  return status;
 }
 
 
index 9e1d82244fc976d8a62bd8ab7d0f577fb5d0374d..2b862248a65e3f52891a26baf165e4e67a52a8a1 100644 (file)
@@ -35,6 +35,7 @@
 #include <sys/ptrace.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
+#include <scratch_buffer.h>
 
 #include <ldsodefs.h>
 #include <version.h>
@@ -118,18 +119,25 @@ main (int argc, char *argv[])
   if (dfd == -1)
     error (EXIT_FAILURE, errno, gettext ("cannot open %s"), buf);
 
-  size_t exesize = 1024;
-#ifdef PATH_MAX
-  exesize = PATH_MAX;
-#endif
-  exe = alloca (exesize);
+  struct scratch_buffer exebuf;
+  scratch_buffer_init (&exebuf);
   ssize_t nexe;
-  while ((nexe = readlinkat (dfd, "exe", exe, exesize)) == exesize)
-    extend_alloca (exe, exesize, 2 * exesize);
+  while ((nexe = readlinkat (dfd, "exe",
+                            exebuf.data, exebuf.length)) == exebuf.length)
+    {
+      if (!scratch_buffer_grow (&exebuf))
+       {
+         nexe = -1;
+         break;
+       }
+    }
   if (nexe == -1)
     exe = (char *) "<program name undetermined>";
   else
-    exe[nexe] = '\0';
+    {
+      exe = exebuf.data;
+      exe[nexe] = '\0';
+    }
 
   /* Stop all threads since otherwise the list of loaded modules might
      change while we are reading it.  */
This page took 0.119177 seconds and 5 git commands to generate.