Skip to content

Commit

Permalink
pldd: Use struct scratch_buffer instead of extend_alloca
Browse files Browse the repository at this point in the history
  • Loading branch information
Florian Weimer committed Apr 8, 2015
1 parent da0cf65 commit 7b8399f
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 19 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
32 changes: 21 additions & 11 deletions elf/pldd-xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand All @@ -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;
}


Expand Down
24 changes: 16 additions & 8 deletions elf/pldd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down Expand Up @@ -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. */
Expand Down

0 comments on commit 7b8399f

Please sign in to comment.