mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-19 13:40:59 +08:00
pldd: Use struct scratch_buffer instead of extend_alloca
This commit is contained in:
parent
da0cf658c6
commit
7b8399f479
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
24
elf/pldd.c
24
elf/pldd.c
@ -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. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user