Module Name: src
Committed By: rin
Date: Sun Nov 19 14:03:35 UTC 2017
Modified Files:
src/external/bsd/tre/dist/lib: tre-match-approx.c tre-match-parallel.c
Log Message:
Add missing integer overflow checks to avoid out-of-bound write reported in
CVE-2016-8859, partially taken from musl libc:
https://git.musl-libc.org/cgit/musl/commit/src/regex/regexec.c?id=c3edc06d1e1360f3570db9155d6b318ae0d0f0f7
https://git.musl-libc.org/cgit/musl/commit/src/regex/regexec.c?id=6582baa752a8facb2c8a7b5b3dcf67331429cdc1
To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/external/bsd/tre/dist/lib/tre-match-approx.c \
src/external/bsd/tre/dist/lib/tre-match-parallel.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/tre/dist/lib/tre-match-approx.c
diff -u src/external/bsd/tre/dist/lib/tre-match-approx.c:1.4 src/external/bsd/tre/dist/lib/tre-match-approx.c:1.5
--- src/external/bsd/tre/dist/lib/tre-match-approx.c:1.4 Sun Nov 19 13:22:58 2017
+++ src/external/bsd/tre/dist/lib/tre-match-approx.c Sun Nov 19 14:03:35 2017
@@ -252,6 +252,16 @@ tre_tnfa_run_approx(const tre_tnfa_t *tn
or with malloc() if alloca is unavailable. */
{
unsigned char *buf_cursor;
+
+ /* Ensure that tag_bytes*num_states cannot overflow, and that it don't
+ * contribute more than 1/8 of SIZE_MAX to total_bytes. */
+ if (num_tags > SIZE_MAX/(8 * sizeof(*tmp_tags) * tnfa->num_states))
+ return REG_ESPACE;
+
+ /* Likewise check reach_bytes. */
+ if (tnfa->num_states > SIZE_MAX/(8 * sizeof(*reach_next)))
+ return REG_ESPACE;
+
/* Space needed for one array of tags. */
size_t tag_bytes = sizeof(*tmp_tags) * num_tags;
/* Space needed for one reach table. */
Index: src/external/bsd/tre/dist/lib/tre-match-parallel.c
diff -u src/external/bsd/tre/dist/lib/tre-match-parallel.c:1.4 src/external/bsd/tre/dist/lib/tre-match-parallel.c:1.5
--- src/external/bsd/tre/dist/lib/tre-match-parallel.c:1.4 Sun Nov 19 13:22:58 2017
+++ src/external/bsd/tre/dist/lib/tre-match-parallel.c Sun Nov 19 14:03:35 2017
@@ -141,6 +141,20 @@ tre_tnfa_run_parallel(const tre_tnfa_t *
{
size_t tbytes, rbytes, pbytes, xbytes, total_bytes;
char *tmp_buf;
+
+ /* Ensure that tbytes and xbytes*num_states cannot overflow, and that
+ * they don't contribute more than 1/8 of SIZE_MAX to total_bytes. */
+ if (num_tags > SIZE_MAX/(8 * sizeof(int) * tnfa->num_states))
+ return REG_ESPACE;
+
+ /* Likewise check rbytes. */
+ if (tnfa->num_states+1 > SIZE_MAX/(8 * sizeof(*reach_next)))
+ return REG_ESPACE;
+
+ /* Likewise check pbytes. */
+ if (tnfa->num_states > SIZE_MAX/(8 * sizeof(*reach_pos)))
+ return REG_ESPACE;
+
/* Compute the length of the block we need. */
tbytes = sizeof(*tmp_tags) * num_tags;
rbytes = sizeof(*reach_next) * (tnfa->num_states + 1);