[PATCH][BZ #16046] Static dlopen correction fallout fixes
Maciej W. Rozycki
macro@codesourcery.com
Mon Feb 3 13:19:00 GMT 2014
On Fri, 31 Jan 2014, Roland McGrath wrote:
> > Thinking more about the test case I have concluded that maybe a
> > path-of-least-resistance check like below would do. It verifies that
> > there's exactly one link map whose file name is null, as is the case with
> > the main executable only. This approach may not be particularly robust,
> > but it does cover what BZ #16046 is about.
>
> It's a start. Ideal would be to look at all the places you had to change
> and figure out what user-visible effects those changes had.
Only elf/dl-iteratephdr.c (covered here) and elf/dl-load.c (default lib
search path) changes can have any user-visible effect. The rest are
internal consistency updates, e.g. you can't really test an assertion
unless there's a separate bug to be fixed. I'll see if I can think of a
test case covering the default lib search path for static executables.
> > +static int count;
>
> Why have a static instead of passing the address of a local in the void *?
I didn't want to overcomplicate code, however if you prefer using the
iterator's argument, then I'm fine with that.
> > +static int
> > +callback (struct dl_phdr_info *info, size_t size, void *data)
> > +{
> > + if (!*info->dlpi_name)
>
> No implicit Boolean coercion please: (info->dlpi_name[0] == '\0') is the
> canonical way to write this expression.
>
> > +int
> > +main(void)
>
> Space before paren.
>
> It's also good to have a comment simply explaining what it's verifying,
> even though it is fairly obvious in this case.
The rest I agree make the piece a little bit better. I took the
opportunity and made further adjustments, specifically wrapped the case in
the test skeleton in case it loops or something and removed the unneeded
_GNU_SOURCE definition (already provided by include/libc-symbols.h).
Here's the resulting new version. Any further suggestions or comments?
2014-02-03 Maciej W. Rozycki <macro@codesourcery.com>
[BZ #16046]
elf/tst-dl-iter-static.c: New file.
elf/Makefile (tests-static): Add tst-dl-iter-static.
Maciej
glibc-static-dlopen-16046-test.diff
Index: glibc-fsf-trunk-quilt/elf/Makefile
===================================================================
--- glibc-fsf-trunk-quilt.orig/elf/Makefile 2014-01-29 12:29:54.000000000 +0000
+++ glibc-fsf-trunk-quilt/elf/Makefile 2014-01-31 18:09:48.501960005 +0000
@@ -123,7 +123,7 @@ tests = tst-tls1 tst-tls2 tst-tls9 tst-l
tst-auxv
tests-static = tst-tls1-static tst-tls2-static tst-stackguard1-static \
tst-leaks1-static tst-array1-static tst-array5-static \
- tst-ptrguard1-static
+ tst-ptrguard1-static tst-dl-iter-static
ifeq (yes,$(build-shared))
tests-static += tst-tls9-static
tst-tls9-static-ENV = \
Index: glibc-fsf-trunk-quilt/elf/tst-dl-iter-static.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ glibc-fsf-trunk-quilt/elf/tst-dl-iter-static.c 2014-02-03 11:31:51.541961661 +0000
@@ -0,0 +1,52 @@
+/* BZ #16046 dl_iterate_phdr static executable test.
+ Copyright (C) 2014 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <link.h>
+
+/* Check that the link map of the static executable itself is iterated
+ over exactly once. */
+
+static int
+callback (struct dl_phdr_info *info, size_t size, void *data)
+{
+ union
+ {
+ void *data;
+ int *count;
+ }
+ u = { .data = data };
+
+ if (info->dlpi_name[0] == '\0')
+ (*u.count)++;
+
+ return 0;
+}
+
+static int
+do_test (void)
+{
+ int count = 0;
+ int status;
+
+ status = dl_iterate_phdr (callback, &count);
+
+ return status || count != 1;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
More information about the Libc-alpha
mailing list