]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Avoid confusing compiler with dynamically impossible statically invalid dereference...
authorRoland McGrath <roland@hack.frob.com>
Fri, 17 Apr 2015 21:29:40 +0000 (14:29 -0700)
committerRoland McGrath <roland@hack.frob.com>
Fri, 17 Apr 2015 21:29:40 +0000 (14:29 -0700)
ChangeLog
elf/dl-close.c

index 967a8c85ea9f00118d6a28004493baddb28d3c9b..0b648bfb1153f302d9efd7db8c0c6b7c85e642e2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2015-04-17  Roland McGrath  <roland@hack.frob.com>
 
+       * elf/dl-close.c (_dl_close_worker) [DL_NNS == 1]: Just assert that
+       IMAP->l_prev cannot be null, and #if out the code for the contrary
+       case, avoiding 'assert (nsid != LM_ID_BASE)' making the compiler
+       believe that NS (&_dl_ns[NSID]) could point outside the array.
+
        * elf/dl-open.c (_dl_open): Use __glibc_unlikely in invalid namespace
        check.  Reject NSID < 0 and NSID >= dl_nns, and check for DL_NNS==1,
        before using NSID as an index.
index cf8f9e0465df59bae334a02ab19c33acc9eb100a..412f71d70bace8bff7d7d9f1f5bd11746bf1691d 100644 (file)
@@ -641,9 +641,16 @@ _dl_close_worker (struct link_map *map)
          DL_UNMAP (imap);
 
          /* Finally, unlink the data structure and free it.  */
-         if (imap->l_prev != NULL)
-           imap->l_prev->l_next = imap->l_next;
-         else
+#if DL_NNS == 1
+         /* The assert in the (imap->l_prev == NULL) case gives
+            the compiler license to warn that NS points outside
+            the dl_ns array bounds in that case (as nsid != LM_ID_BASE
+            is tantamount to nsid >= DL_NNS).  That should be impossible
+            in this configuration, so just assert about it instead.  */
+         assert (nsid == LM_ID_BASE);
+         assert (imap->l_prev != NULL);
+#else
+         if (imap->l_prev == NULL)
            {
              assert (nsid != LM_ID_BASE);
              ns->_ns_loaded = imap->l_next;
@@ -652,6 +659,9 @@ _dl_close_worker (struct link_map *map)
                 we leave for debuggers to examine.  */
              r->r_map = (void *) ns->_ns_loaded;
            }
+         else
+#endif
+           imap->l_prev->l_next = imap->l_next;
 
          --ns->_ns_nloaded;
          if (imap->l_next != NULL)