Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/bsd/tre/dist/lib Add missing integer overflow check...



details:   https://anonhg.NetBSD.org/src/rev/04d233151ff1
branches:  trunk
changeset: 827943:04d233151ff1
user:      rin <rin%NetBSD.org@localhost>
date:      Sun Nov 19 14:03:35 2017 +0000

description:
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

diffstat:

 external/bsd/tre/dist/lib/tre-match-approx.c   |  10 ++++++++++
 external/bsd/tre/dist/lib/tre-match-parallel.c |  14 ++++++++++++++
 2 files changed, 24 insertions(+), 0 deletions(-)

diffs (44 lines):

diff -r 414f8bf6334d -r 04d233151ff1 external/bsd/tre/dist/lib/tre-match-approx.c
--- a/external/bsd/tre/dist/lib/tre-match-approx.c      Sun Nov 19 13:22:58 2017 +0000
+++ b/external/bsd/tre/dist/lib/tre-match-approx.c      Sun Nov 19 14:03:35 2017 +0000
@@ -252,6 +252,16 @@
      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. */
diff -r 414f8bf6334d -r 04d233151ff1 external/bsd/tre/dist/lib/tre-match-parallel.c
--- a/external/bsd/tre/dist/lib/tre-match-parallel.c    Sun Nov 19 13:22:58 2017 +0000
+++ b/external/bsd/tre/dist/lib/tre-match-parallel.c    Sun Nov 19 14:03:35 2017 +0000
@@ -141,6 +141,20 @@
   {
     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);



Home | Main Index | Thread Index | Old Index