diff options
author | Florian Weimer <fweimer@redhat.com> | 2015-01-15 15:16:54 -0500 |
---|---|---|
committer | Adhemerval Zanella <azanella@linux.vnet.ibm.com> | 2015-01-15 15:16:54 -0500 |
commit | f7865ec21e8ad32929509796497fa3b44c3ef826 (patch) | |
tree | c373a461dc63de6e98356f25437d8967101411ee | |
parent | c7a91d241b095855e06e0bd00287968df2f6d87e (diff) | |
download | glibc-f7865ec21e8ad32929509796497fa3b44c3ef826.zip glibc-f7865ec21e8ad32929509796497fa3b44c3ef826.tar.gz glibc-f7865ec21e8ad32929509796497fa3b44c3ef826.tar.bz2 |
posix_spawn_file_actions_addopen needs to copy the path argument (BZ 17048)
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.
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | NEWS | 12 | ||||
-rw-r--r-- | posix/spawn_faction_addopen.c | 13 | ||||
-rw-r--r-- | posix/spawn_faction_destroy.c | 22 | ||||
-rw-r--r-- | posix/spawn_int.h | 2 | ||||
-rw-r--r-- | posix/tst-spawn.c | 10 |
6 files changed, 59 insertions, 13 deletions
@@ -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] @@ -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, diff --git a/posix/spawn_faction_addopen.c b/posix/spawn_faction_addopen.c index 86951ae..368da5a 100644 --- a/posix/spawn_faction_addopen.c +++ b/posix/spawn_faction_addopen.c @@ -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; diff --git a/posix/spawn_faction_destroy.c b/posix/spawn_faction_destroy.c index de43724..e120fba 100644 --- a/posix/spawn_faction_destroy.c +++ b/posix/spawn_faction_destroy.c @@ -18,11 +18,29 @@ #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; } diff --git a/posix/spawn_int.h b/posix/spawn_int.h index 5609e58..861e3b4 100644 --- a/posix/spawn_int.h +++ b/posix/spawn_int.h @@ -22,7 +22,7 @@ struct __spawn_action struct { int fd; - const char *path; + char *path; int oflag; mode_t mode; } open_action; diff --git a/posix/tst-spawn.c b/posix/tst-spawn.c index 162fd72..71943f9 100644 --- a/posix/tst-spawn.c +++ b/posix/tst-spawn.c @@ -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) |