]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
elf: Count components of the expanded path in _dl_init_path [BZ #22607]
authorFlorian Weimer <fweimer@redhat.com>
Thu, 14 Dec 2017 14:05:57 +0000 (15:05 +0100)
committerTulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
Fri, 6 Apr 2018 19:23:54 +0000 (16:23 -0300)
(cherry picked from commit 3ff3dfa5af313a6ea33f3393916f30eece4f0171)

ChangeLog
NEWS
elf/dl-load.c

index 066b0d24029739e51d7983d06ba3f4a46e93c2df..3c8fd97fe0daabad5a49ceb4e906993ea353c945 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-12-14  Florian Weimer  <fweimer@redhat.com>
+
+       [BZ #22607]
+       CVE-2017-1000409
+       * elf/dl-load.c (_dl_init_paths): Compute number of components in
+       the expanded path string.
+
 2017-12-30  Aurelien Jarno  <aurelien@aurel32.net>
            Dmitry V. Levin  <ldv@altlinux.org>
 
diff --git a/NEWS b/NEWS
index 3a33aeeea12d5cc19dc5cff186fc81eae2bdc28d..7b2e078224d2c731bfe8920a7e8f0f609b80ac0b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -70,6 +70,12 @@ Version 2.22.1
 * CVE-2017-16997: Incorrect handling of RPATH or RUNPATH containing $ORIGIN
   for AT_SECURE or SUID binaries could be used to load libraries from the
   current directory.
+
+* CVE-2017-1000409: Buffer overflow in _dl_init_paths due to miscomputation
+  of the number of search path components.  (This is not a security
+  vulnerability per se because no trust boundary is crossed if the fix for
+  CVE-2017-1000366 has been applied, but it is mentioned here only because
+  of the CVE assignment.)  Reported by Qualys.
 \f
 Version 2.22
 
index d0ac65e65022744a77abe296e4c00cc9bb5b9ab5..f22fd0d303c0411b5dee3a11e2fe5ea148c3b25d 100644 (file)
@@ -792,8 +792,6 @@ _dl_init_paths (const char *llp)
 
   if (llp != NULL && *llp != '\0')
     {
-      size_t nllp;
-      const char *cp = llp;
       char *llp_tmp;
 
 #ifdef SHARED
@@ -816,13 +814,10 @@ _dl_init_paths (const char *llp)
 
       /* Decompose the LD_LIBRARY_PATH contents.  First determine how many
         elements it has.  */
-      nllp = 1;
-      while (*cp)
-       {
-         if (*cp == ':' || *cp == ';')
-           ++nllp;
-         ++cp;
-       }
+      size_t nllp = 1;
+      for (const char *cp = llp_tmp; *cp != '\0'; ++cp)
+       if (*cp == ':' || *cp == ';')
+         ++nllp;
 
       env_path_list.dirs = (struct r_search_path_elem **)
        malloc ((nllp + 1) * sizeof (struct r_search_path_elem *));