diff options
author | Armin Kuster <akuster@mvista.com> | 2016-10-19 18:00:46 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-10-28 16:15:19 +0100 |
commit | 2031738d28768ebd95cce9c355521142dd1a88c4 (patch) | |
tree | d6bd13d6338beb63d66eb9217a86870e7ff7e51d | |
parent | 95970f1941e9972103f6b1dc8f2f91fb84b5e75a (diff) | |
download | poky-2031738d28768ebd95cce9c355521142dd1a88c4.tar.gz |
musl: Security fix CVE-2016-8859
CVE-2016-8859: TRE & musl libc regex integer overflows in buffer size computations
Affects musl <= 1.1.15
(From OE-Core rev: ac82bd95ec62a6af8286289889a9d36fa5f58005)
Signed-off-by: Armin Kuster <akuster@mvista.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/recipes-core/musl/files/CVE-2016-8859.patch | 79 | ||||
-rw-r--r-- | meta/recipes-core/musl/musl_git.bb | 1 |
2 files changed, 80 insertions, 0 deletions
diff --git a/meta/recipes-core/musl/files/CVE-2016-8859.patch b/meta/recipes-core/musl/files/CVE-2016-8859.patch new file mode 100644 index 0000000000..82da86f0bd --- /dev/null +++ b/meta/recipes-core/musl/files/CVE-2016-8859.patch | |||
@@ -0,0 +1,79 @@ | |||
1 | From c3edc06d1e1360f3570db9155d6b318ae0d0f0f7 Mon Sep 17 00:00:00 2001 | ||
2 | From: Rich Felker <dalias@aerifal.cx> | ||
3 | Date: Thu, 6 Oct 2016 18:34:58 -0400 | ||
4 | Subject: [PATCH] fix missing integer overflow checks in regexec buffer size | ||
5 | computations | ||
6 | |||
7 | most of the possible overflows were already ruled out in practice by | ||
8 | regcomp having already succeeded performing larger allocations. | ||
9 | however at least the num_states*num_tags multiplication can clearly | ||
10 | overflow in practice. for safety, check them all, and use the proper | ||
11 | type, size_t, rather than int. | ||
12 | |||
13 | also improve comments, use calloc in place of malloc+memset, and | ||
14 | remove bogus casts. | ||
15 | |||
16 | Upstream-Status: Backport | ||
17 | CVE: CVE-2016-8859 | ||
18 | |||
19 | Signed-off-by: Armin Kuster <akuster@mvista.com> | ||
20 | |||
21 | --- | ||
22 | src/regex/regexec.c | 23 ++++++++++++++++++----- | ||
23 | 1 file changed, 18 insertions(+), 5 deletions(-) | ||
24 | |||
25 | diff --git a/src/regex/regexec.c b/src/regex/regexec.c | ||
26 | index 16c5d0a..dd52319 100644 | ||
27 | --- a/src/regex/regexec.c | ||
28 | +++ b/src/regex/regexec.c | ||
29 | @@ -34,6 +34,7 @@ | ||
30 | #include <wchar.h> | ||
31 | #include <wctype.h> | ||
32 | #include <limits.h> | ||
33 | +#include <stdint.h> | ||
34 | |||
35 | #include <regex.h> | ||
36 | |||
37 | @@ -206,11 +207,24 @@ tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string, | ||
38 | |||
39 | /* Allocate memory for temporary data required for matching. This needs to | ||
40 | be done for every matching operation to be thread safe. This allocates | ||
41 | - everything in a single large block from the stack frame using alloca() | ||
42 | - or with malloc() if alloca is unavailable. */ | ||
43 | + everything in a single large block with calloc(). */ | ||
44 | { | ||
45 | - int tbytes, rbytes, pbytes, xbytes, total_bytes; | ||
46 | + size_t tbytes, rbytes, pbytes, xbytes, total_bytes; | ||
47 | char *tmp_buf; | ||
48 | + | ||
49 | + /* Ensure that tbytes and xbytes*num_states cannot overflow, and that | ||
50 | + * they don't contribute more than 1/8 of SIZE_MAX to total_bytes. */ | ||
51 | + if (num_tags > SIZE_MAX/(8 * sizeof(int) * tnfa->num_states)) | ||
52 | + goto error_exit; | ||
53 | + | ||
54 | + /* Likewise check rbytes. */ | ||
55 | + if (tnfa->num_states+1 > SIZE_MAX/(8 * sizeof(*reach_next))) | ||
56 | + goto error_exit; | ||
57 | + | ||
58 | + /* Likewise check pbytes. */ | ||
59 | + if (tnfa->num_states > SIZE_MAX/(8 * sizeof(*reach_pos))) | ||
60 | + goto error_exit; | ||
61 | + | ||
62 | /* Compute the length of the block we need. */ | ||
63 | tbytes = sizeof(*tmp_tags) * num_tags; | ||
64 | rbytes = sizeof(*reach_next) * (tnfa->num_states + 1); | ||
65 | @@ -221,10 +235,9 @@ tre_tnfa_run_parallel(const tre_tnfa_t *tnfa, const void *string, | ||
66 | + (rbytes + xbytes * tnfa->num_states) * 2 + tbytes + pbytes; | ||
67 | |||
68 | /* Allocate the memory. */ | ||
69 | - buf = xmalloc((unsigned)total_bytes); | ||
70 | + buf = calloc(total_bytes, 1); | ||
71 | if (buf == NULL) | ||
72 | return REG_ESPACE; | ||
73 | - memset(buf, 0, (size_t)total_bytes); | ||
74 | |||
75 | /* Get the various pointers within tmp_buf (properly aligned). */ | ||
76 | tmp_tags = (void *)buf; | ||
77 | -- | ||
78 | 2.7.4 | ||
79 | |||
diff --git a/meta/recipes-core/musl/musl_git.bb b/meta/recipes-core/musl/musl_git.bb index c07101b748..1ee56b6434 100644 --- a/meta/recipes-core/musl/musl_git.bb +++ b/meta/recipes-core/musl/musl_git.bb | |||
@@ -11,6 +11,7 @@ PV = "1.1.15+git${SRCPV}" | |||
11 | 11 | ||
12 | SRC_URI = "git://git.musl-libc.org/musl \ | 12 | SRC_URI = "git://git.musl-libc.org/musl \ |
13 | file://0001-Make-dynamic-linker-a-relative-symlink-to-libc.patch \ | 13 | file://0001-Make-dynamic-linker-a-relative-symlink-to-libc.patch \ |
14 | file://CVE-2016-8859.patch \ | ||
14 | " | 15 | " |
15 | 16 | ||
16 | S = "${WORKDIR}/git" | 17 | S = "${WORKDIR}/git" |