vapier      15/08/12 04:51:35

  Modified:             README.history
  Added:               
                        
00_all_0017-Readd-O_LARGEFILE-flag-for-openat64-bug-18781.patch
                        
00_all_0018-Clear-DF_1_NODELETE-flag-only-for-failed-to-load-lib.patch
  Log:
  more upstream fixes

Revision  Changes    Path
1.4                  src/patchsets/glibc/2.22/README.history

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/glibc/2.22/README.history?rev=1.4&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/glibc/2.22/README.history?rev=1.4&content-type=text/plain
diff : 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/glibc/2.22/README.history?r1=1.3&r2=1.4

Index: README.history
===================================================================
RCS file: /var/cvsroot/gentoo/src/patchsets/glibc/2.22/README.history,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- README.history      12 Aug 2015 04:17:01 -0000      1.3
+++ README.history      12 Aug 2015 04:51:35 -0000      1.4
@@ -1,3 +1,7 @@
+4              12 Aug 2015
+       + 00_all_0017-Readd-O_LARGEFILE-flag-for-openat64-bug-18781.patch
+       + 00_all_0018-Clear-DF_1_NODELETE-flag-only-for-failed-to-load-lib.patch
+
 3              09 Aug 2015
        + 00_all_0015-microblaze-include-unix-sysdep.h.patch
        + 00_all_0016-hppa-Fix-miscompilation-of-sched_setaffinity-BZ-1848.patch



1.1                  
src/patchsets/glibc/2.22/00_all_0017-Readd-O_LARGEFILE-flag-for-openat64-bug-18781.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/glibc/2.22/00_all_0017-Readd-O_LARGEFILE-flag-for-openat64-bug-18781.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/glibc/2.22/00_all_0017-Readd-O_LARGEFILE-flag-for-openat64-bug-18781.patch?rev=1.1&content-type=text/plain

Index: 00_all_0017-Readd-O_LARGEFILE-flag-for-openat64-bug-18781.patch
===================================================================
>From 6f9b62ae8465ec6cb6561f309a2393899091f1c7 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <[email protected]>
Date: Mon, 10 Aug 2015 14:12:47 +0200
Subject: [PATCH] Readd O_LARGEFILE flag for openat64 (bug 18781)

(cherry picked from commit eb32b0d40308166c4d8f6330cc2958cb1e545075)
(cherry picked from commit 561a9f11a974a447acb3dd03550a05df701a900e)
---
 io/test-lfs.c                    | 21 ++++++++++++++++++++-
 sysdeps/unix/sysv/linux/openat.c |  5 +++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/io/test-lfs.c b/io/test-lfs.c
index 539c2a2..b6ebae4 100644
--- a/io/test-lfs.c
+++ b/io/test-lfs.c
@@ -144,7 +144,7 @@ test_ftello (void)
 int
 do_test (int argc, char *argv[])
 {
-  int ret;
+  int ret, fd2;
   struct stat64 statbuf;
 
   ret = lseek64 (fd, TWO_GB+100, SEEK_SET);
@@ -195,6 +195,25 @@ do_test (int argc, char *argv[])
     error (EXIT_FAILURE, 0, "stat reported size %lld instead of %lld.",
           (long long int) statbuf.st_size, (TWO_GB + 100 + 5));
 
+  fd2 = openat64 (AT_FDCWD, name, O_RDWR);
+  if (fd2 == -1)
+    {
+      if (errno == ENOSYS)
+       {
+         /* Silently ignore this test.  */
+         error (0, 0, "openat64 is not supported");
+       }
+      else
+       error (EXIT_FAILURE, errno, "openat64 failed to open big file");
+    }
+  else
+    {
+      ret = close (fd2);
+
+      if (ret == -1)
+       error (EXIT_FAILURE, errno, "error closing file");
+    }
+
   test_ftello ();
 
   return 0;
diff --git a/sysdeps/unix/sysv/linux/openat.c b/sysdeps/unix/sysv/linux/openat.c
index 6777123..ad8e31d 100644
--- a/sysdeps/unix/sysv/linux/openat.c
+++ b/sysdeps/unix/sysv/linux/openat.c
@@ -68,6 +68,11 @@ __OPENAT (int fd, const char *file, int oflag, ...)
       va_end (arg);
     }
 
+  /* We have to add the O_LARGEFILE flag for openat64.  */
+#ifdef MORE_OFLAGS
+  oflag |= MORE_OFLAGS;
+#endif
+
   return SYSCALL_CANCEL (openat, fd, file, oflag, mode);
 }
 libc_hidden_def (__OPENAT)
-- 
2.4.4




1.1                  
src/patchsets/glibc/2.22/00_all_0018-Clear-DF_1_NODELETE-flag-only-for-failed-to-load-lib.patch

file : 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/glibc/2.22/00_all_0018-Clear-DF_1_NODELETE-flag-only-for-failed-to-load-lib.patch?rev=1.1&view=markup
plain: 
http://sources.gentoo.org/viewvc.cgi/gentoo/src/patchsets/glibc/2.22/00_all_0018-Clear-DF_1_NODELETE-flag-only-for-failed-to-load-lib.patch?rev=1.1&content-type=text/plain

Index: 00_all_0018-Clear-DF_1_NODELETE-flag-only-for-failed-to-load-lib.patch
===================================================================
>From 969fb008f467a27b7cf6cc3cb08f80a3072daf77 Mon Sep 17 00:00:00 2001
From: Maxim Ostapenko <[email protected]>
Date: Mon, 10 Aug 2015 10:47:54 +0300
Subject: [PATCH] Clear DF_1_NODELETE flag only for failed to load library.

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

If dlopen fails to load an object that has triggered loading libpthread it
causes ld.so to unload libpthread because its DF_1_NODELETE flags has been
forcefully cleared. The next call to __rtdl_unlock_lock_recursive will crash
since pthread_mutex_unlock no longer exists.

This patch moves l->l_flags_1 &= ~DF_1_NODELETE out of loop through all loaded
libraries and performs the action only on inconsistent one.

        [BZ #18778]
        * elf/Makefile (tests): Add Add tst-nodelete2.
        (modules-names): Add tst-nodelete2mod.
        (tst-nodelete2mod.so-no-z-defs): New.
        ($(objpfx)tst-nodelete2): Likewise.
        ($(objpfx)tst-nodelete2.out): Likewise.
        (LDFLAGS-tst-nodelete2): Likewise.
        * elf/dl-close.c (_dl_close_worker): Move DF_1_NODELETE clearing
        out of loop through all loaded libraries.
        * elf/tst-nodelete2.c: New file.
        * elf/tst-nodelete2mod.c: Likewise.

(cherry picked from commit f25238ffe0455013174438376b3ee88df496f9d1)
(cherry picked from commit a34d1c6afc86521d6ad17662a3b5362d8481514c)
---
 elf/Makefile                                      | 11 +++++--
 elf/dl-close.c                                    | 15 ++++-----
 elf/tst-nodelete2.c                               | 37 +++++++++++++++++++++++
 elf/{tst-znodelete-zlib.cc => tst-nodelete2mod.c} |  3 +-
 4 files changed, 56 insertions(+), 10 deletions(-)
 create mode 100644 elf/tst-nodelete2.c
 rename elf/{tst-znodelete-zlib.cc => tst-nodelete2mod.c} (50%)

diff --git a/elf/Makefile b/elf/Makefile
index a995bd2..e3e083c 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -148,7 +148,8 @@ tests += loadtest restest1 preloadtest loadfail multiload 
origtest resolvfail \
         tst-unique1 tst-unique2 $(if $(CXX),tst-unique3 tst-unique4 \
         tst-nodelete) \
         tst-initorder tst-initorder2 tst-relsort1 tst-null-argv \
-        tst-ptrguard1 tst-tlsalign tst-tlsalign-extern tst-nodelete-opened
+        tst-ptrguard1 tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
+        tst-nodelete2
 #       reldep9
 ifeq ($(build-hardcoded-path-in-tests),yes)
 tests += tst-dlopen-aout
@@ -218,7 +219,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 
testobj5 testobj6 \
                tst-initorder2d \
                tst-relsort1mod1 tst-relsort1mod2 tst-array2dep \
                tst-array5dep tst-null-argv-lib \
-               tst-tlsalign-lib tst-nodelete-opened-lib
+               tst-tlsalign-lib tst-nodelete-opened-lib tst-nodelete2mod
 ifeq (yes,$(have-protected-data))
 modules-names += tst-protected1moda tst-protected1modb
 tests += tst-protected1a tst-protected1b
@@ -594,6 +595,7 @@ tst-auditmod9b.so-no-z-defs = yes
 tst-nodelete-uniquemod.so-no-z-defs = yes
 tst-nodelete-rtldmod.so-no-z-defs = yes
 tst-nodelete-zmod.so-no-z-defs = yes
+tst-nodelete2mod.so-no-z-defs = yes
 
 ifeq ($(build-shared),yes)
 # Build all the modules even when not actually running test programs.
@@ -1164,6 +1166,11 @@ $(objpfx)tst-nodelete.out: 
$(objpfx)tst-nodelete-uniquemod.so \
 LDFLAGS-tst-nodelete = -rdynamic
 LDFLAGS-tst-nodelete-zmod.so = -Wl,--enable-new-dtags,-z,nodelete
 
+$(objpfx)tst-nodelete2: $(libdl)
+$(objpfx)tst-nodelete2.out: $(objpfx)tst-nodelete2mod.so
+
+LDFLAGS-tst-nodelete2 = -rdynamic
+
 $(objpfx)tst-initorder-cmp.out: tst-initorder.exp $(objpfx)tst-initorder.out
        cmp $^ > $@; \
        $(evaluate-test)
diff --git a/elf/dl-close.c b/elf/dl-close.c
index 9105277..c897247 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -144,6 +144,14 @@ _dl_close_worker (struct link_map *map, bool force)
   char done[nloaded];
   struct link_map *maps[nloaded];
 
+  /* Clear DF_1_NODELETE to force object deletion.  We don't need to touch
+     l_tls_dtor_count because forced object deletion only happens when an
+     error occurs during object load.  Destructor registration for TLS
+     non-POD objects should not have happened till then for this
+     object.  */
+  if (force)
+    map->l_flags_1 &= ~DF_1_NODELETE;
+
   /* Run over the list and assign indexes to the link maps and enter
      them into the MAPS array.  */
   int idx = 0;
@@ -153,13 +161,6 @@ _dl_close_worker (struct link_map *map, bool force)
       maps[idx] = l;
       ++idx;
 
-      /* Clear DF_1_NODELETE to force object deletion.  We don't need to touch
-        l_tls_dtor_count because forced object deletion only happens when an
-        error occurs during object load.  Destructor registration for TLS
-        non-POD objects should not have happened till then for this
-        object.  */
-      if (force)
-       l->l_flags_1 &= ~DF_1_NODELETE;
     }
   assert (idx == nloaded);
 
diff --git a/elf/tst-nodelete2.c b/elf/tst-nodelete2.c
new file mode 100644
index 0000000..388e8af
--- /dev/null
+++ b/elf/tst-nodelete2.c
@@ -0,0 +1,37 @@
+#include "../dlfcn/dlfcn.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <gnu/lib-names.h>
+
+static int
+do_test (void)
+{
+  int result = 0;
+
+  printf ("\nOpening pthread library.\n");
+  void *pthread = dlopen (LIBPTHREAD_SO, RTLD_LAZY);
+
+  /* This is a test for correct DF_1_NODELETE clearing when dlopen failure
+     happens.  We should clear DF_1_NODELETE for failed library only, because
+     doing this for others (e.g. libpthread) might cause them to be unloaded,
+     that may lead to some global references (e.g. __rtld_lock_unlock) to be
+     broken.  The dlopen should fail because of undefined symbols in shared
+     library, that cause DF_1_NODELETE to be cleared.  For libpthread, this
+     flag should be set, because if not, SIGSEGV will happen in dlclose.  */
+  if (dlopen ("tst-nodelete2mod.so", RTLD_NOW) != NULL)
+    {
+      printf ("Unique symbols test failed\n");
+      result = 1;
+    }
+
+  if (pthread)
+    dlclose (pthread);
+
+  if (result == 0)
+    printf ("SUCCESS\n");
+
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/elf/tst-znodelete-zlib.cc b/elf/tst-nodelete2mod.c
similarity index 50%
rename from elf/tst-znodelete-zlib.cc
rename to elf/tst-nodelete2mod.c
index 1e8f368..e88c756 100644
--- a/elf/tst-znodelete-zlib.cc
+++ b/elf/tst-nodelete2mod.c
@@ -1,6 +1,7 @@
+/* Undefined symbol.  */
 extern int not_exist (void);
 
 int foo (void)
 {
-  return  not_exist ();
+  return not_exist ();
 }
-- 
2.4.4





Reply via email to