This is the mail archive of the glibc-cvs@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]

GNU C Library master sources branch master updated. glibc-2.21-275-g2bd2cad


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  2bd2cad9e8a410643e80efa0b15f6f2882e1271b (commit)
      from  328c44c3670ebf6c1bd790acddce65a12998cd6c (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=2bd2cad9e8a410643e80efa0b15f6f2882e1271b

commit 2bd2cad9e8a410643e80efa0b15f6f2882e1271b
Author: Roland McGrath <roland@hack.frob.com>
Date:   Fri Apr 17 14:29:40 2015 -0700

    Avoid confusing compiler with dynamically impossible statically invalid dereference in _dl_close_worker.

diff --git a/ChangeLog b/ChangeLog
index 967a8c8..0b648bf 100644
--- 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.
diff --git a/elf/dl-close.c b/elf/dl-close.c
index cf8f9e0..412f71d 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -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)

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog      |    5 +++++
 elf/dl-close.c |   16 +++++++++++++---
 2 files changed, 18 insertions(+), 3 deletions(-)


hooks/post-receive
-- 
GNU C Library master sources


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