]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
posix_spawn_file_actions_addopen needs to copy the path argument (BZ 17048)
authorFlorian Weimer <fweimer@redhat.com>
Thu, 15 Jan 2015 20:16:54 +0000 (15:16 -0500)
committerAdhemerval Zanella <azanella@linux.vnet.ibm.com>
Thu, 15 Jan 2015 20:16:54 +0000 (15:16 -0500)
POSIX requires that we make a copy, so we allocate a new string
and free it in posix_spawn_file_actions_destroy.

Reported by David Reid, Alex Gaynor, and Glyph Lefkowitz.  This bug
may have security implications.

ChangeLog
NEWS
posix/spawn_faction_addopen.c
posix/spawn_faction_destroy.c
posix/spawn_int.h
posix/tst-spawn.c

index 3f3665074a0edf1d6a20effb61bebbcc26541efd..a101ac8e4efb309573af9da632fe4b0264957c5f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2014-06-11  Florian Weimer  <fweimer@redhat.com>
+
+       [BZ #17048]
+       * posix/spawn_int.h (struct __spawn_action): Make the path string
+       non-const to support deallocation.
+       * posix/spawn_faction_addopen.c
+       (posix_spawn_file_actions_addopen): Make a copy of the pathname.
+       * posix/spawn_faction_destroy.c
+       (posix_spawn_file_actions_destroy): Adjust comment.  Deallocate
+       path in all spawn_do_open actions.
+       * posix/tst-spawn.c (do_test): Exercise the copy operation in
+       posix_spawn_file_actions_addopen.
+
 2014-07-02  Florian Weimer  <fweimer@redhat.com>
 
        [BZ #17137]
diff --git a/NEWS b/NEWS
index fb66b4da231881ff7756033dafbe8bc07d3725aa..17450609e16e5adb25d08cd1526115a75dd427c7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,7 +10,12 @@ Version 2.16.1
 * The following bugs are resolved with this release:
 
   6530, 14195, 14547, 14459, 14476, 14562, 14621, 14648, 14699, 14756, 14831,
-  15078, 15754, 15755, 16072, 17137, 17187, 17325.
+  15078, 15754, 15755, 16072, 17048, 17137, 17187, 17325.
+
+* Decoding a crafted input sequence in the character sets IBM933, IBM935,
+  IBM937, IBM939, IBM1364 could result in an out-of-bounds array read,
+  resulting a denial-of-service security vulnerability in applications which
+  use functions related to iconv. (CVE-2014-6040)
 
 * Locale names, including those obtained from environment variables (LANG
   and the LC_* variables), are more tightly checked for proper syntax.
@@ -28,11 +33,6 @@ Version 2.16.1
   with //TRANSLIT is still possible, and the //IGNORE specifier
   continues to be  supported. (CVE-2014-5119)
 
-* Decoding a crafted input sequence in the character sets IBM933, IBM935,
-  IBM937, IBM939, IBM1364 could result in an out-of-bounds array read,
-  resulting a denial-of-service security vulnerability in applications which
-  use functions related to iconv. (CVE-2014-6040)
-
 * CVE-2013-4332 The pvalloc, valloc, memalign, posix_memalign and
   aligned_alloc functions could allocate too few bytes or corrupt the
   heap when passed very large allocation size values (Bugzilla #15855,
index 86951ae18584795de8b866ee289faad4b49ee8ca..368da5a5f510192efbe7dd263dcd17c20521caa6 100644 (file)
@@ -35,17 +35,24 @@ posix_spawn_file_actions_addopen (posix_spawn_file_actions_t *file_actions,
   if (fd < 0 || fd >= maxfd)
     return EBADF;
 
+  char *path_copy = strdup (path);
+  if (path_copy == NULL)
+    return ENOMEM;
+
   /* Allocate more memory if needed.  */
   if (file_actions->__used == file_actions->__allocated
       && __posix_spawn_file_actions_realloc (file_actions) != 0)
-    /* This can only mean we ran out of memory.  */
-    return ENOMEM;
+    {
+      /* This can only mean we ran out of memory.  */
+      free (path_copy);
+      return ENOMEM;
+    }
 
   /* Add the new value.  */
   rec = &file_actions->__actions[file_actions->__used];
   rec->tag = spawn_do_open;
   rec->action.open_action.fd = fd;
-  rec->action.open_action.path = path;
+  rec->action.open_action.path = path_copy;
   rec->action.open_action.oflag = oflag;
   rec->action.open_action.mode = mode;
 
index de43724ea348816561215a15646e9f1a0b9faa7e..e120fba4ac1e6fa0784bb2e74d65dda85bdd20b7 100644 (file)
 #include <spawn.h>
 #include <stdlib.h>
 
-/* Initialize data structure for file attribute for `spawn' call.  */
+#include "spawn_int.h"
+
+/* Deallocate the file actions.  */
 int
 posix_spawn_file_actions_destroy (posix_spawn_file_actions_t *file_actions)
 {
-  /* Free the memory allocated.  */
+  /* Free the paths in the open actions.  */
+  for (int i = 0; i < file_actions->__used; ++i)
+    {
+      struct __spawn_action *sa = &file_actions->__actions[i];
+      switch (sa->tag)
+       {
+       case spawn_do_open:
+         free (sa->action.open_action.path);
+         break;
+       case spawn_do_close:
+       case spawn_do_dup2:
+         /* No cleanup required.  */
+         break;
+       }
+    }
+
+  /* Free the array of actions.  */
   free (file_actions->__actions);
   return 0;
 }
index 5609e587e1d0bafc0d49b31b2d51d22f7dae7ee0..861e3b47bb583fee26694f09c87af5a7c0bd27d7 100644 (file)
@@ -22,7 +22,7 @@ struct __spawn_action
     struct
     {
       int fd;
-      const char *path;
+      char *path;
       int oflag;
       mode_t mode;
     } open_action;
index 162fd723eb2954ea53a03da76829045d8190bd9b..71943f9a76808555c536b52a44b40466ffdf3fb3 100644 (file)
@@ -168,6 +168,7 @@ do_test (int argc, char *argv[])
   char fd2name[18];
   char fd3name[18];
   char fd4name[18];
+  char *name3_copy;
   char *spargv[12];
 
   /* We must have
@@ -221,9 +222,15 @@ do_test (int argc, char *argv[])
    if (posix_spawn_file_actions_addclose (&actions, fd1) != 0)
      error (EXIT_FAILURE, errno, "posix_spawn_file_actions_addclose");
    /* We want to open the third file.  */
-   if (posix_spawn_file_actions_addopen (&actions, fd3, name3,
+   name3_copy = strdup (name3);
+   if (name3_copy == NULL)
+     error (EXIT_FAILURE, errno, "strdup");
+   if (posix_spawn_file_actions_addopen (&actions, fd3, name3_copy,
                                         O_RDONLY, 0666) != 0)
      error (EXIT_FAILURE, errno, "posix_spawn_file_actions_addopen");
+   /* Overwrite the name to check that a copy has been made.  */
+   memset (name3_copy, 'X', strlen (name3_copy));
+
    /* We dup the second descriptor.  */
    fd4 = MAX (2, MAX (fd1, MAX (fd2, fd3))) + 1;
    if (posix_spawn_file_actions_adddup2 (&actions, fd2, fd4) != 0)
@@ -254,6 +261,7 @@ do_test (int argc, char *argv[])
    /* Cleanup.  */
    if (posix_spawn_file_actions_destroy (&actions) != 0)
      error (EXIT_FAILURE, errno, "posix_spawn_file_actions_destroy");
+   free (name3_copy);
 
   /* Wait for the child.  */
   if (waitpid (pid, &status, 0) != pid)