This is the mail archive of the glibc-bugs@sourceware.org mailing list for the glibc 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]

[Bug dynamic-link/18035] pldd does no longer work, enters infinite loop


https://sourceware.org/bugzilla/show_bug.cgi?id=18035

--- Comment #6 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Adhemerval Zanella
<azanella@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=1a4c27355e146b6d8cc6487b998462c7fdd1048f

commit 1a4c27355e146b6d8cc6487b998462c7fdd1048f
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Thu Apr 11 18:12:00 2019 -0300

    elf: Fix pldd (BZ#18035)

    Since 9182aa67994 (Fix vDSO l_name for GDB's, BZ#387) the initial link_map
    for executable itself and loader will have both l_name and l_libname->name
    holding the same value due:

     elf/dl-object.c

     95   new->l_name = *realname ? realname : (char *) newname->name +
libname_len - 1;

    Since newname->name points to new->l_libname->name.

    This leads to pldd to an infinite call at:

     elf/pldd-xx.c

    203     again:
    204       while (1)
    205         {
    206           ssize_t n = pread64 (memfd, tmpbuf.data, tmpbuf.length,
name_offset);

    228           /* Try the l_libname element.  */
    229           struct E(libname_list) ln;
    230           if (pread64 (memfd, &ln, sizeof (ln), m.l_libname) == sizeof
(ln))
    231             {
    232               name_offset = ln.name;
    233               goto again;
    234             }

    Since the value at ln.name (l_libname->name) will be the same as previously
    read. The straightforward fix is just avoid the check and read the new list
    entry.

    I checked also against binaries issues with old loaders with fix for
BZ#387,
    and pldd could dump the shared objects.

    Checked on x86_64-linux-gnu, i686-linux-gnu, aarch64-linux-gnu, and
    powerpc64le-linux-gnu.

        [BZ #18035]
        * elf/Makefile (tests-container): Add tst-pldd.
        * elf/pldd-xx.c: Use _Static_assert in of pldd_assert.
        (E(find_maps)): Avoid use alloca, use default read file operations
        instead of explicit LFS names, and fix infinite loop.
        * elf/pldd.c: Explicit set _FILE_OFFSET_BITS, cleanup headers.
        (get_process_info): Use _Static_assert instead of assert, use default
        directory operations instead of explicit LFS names, and free some
        leadek pointers.
        * elf/tst-pldd.c: New file.

-- 
You are receiving this mail because:
You are on the CC list for the bug.

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