Fix heap limit checking overflow in pcre2_dfa_match()
This commit is contained in:
parent
3760442647
commit
9c04090949
@ -0,0 +1,67 @@
|
|||||||
|
From 18ee5a9d3779f5e8ee3142326dd65ae75b22bb0b Mon Sep 17 00:00:00 2001
|
||||||
|
From: ph10 <ph10@6239d852-aaf2-0410-a92c-79f79f948069>
|
||||||
|
Date: Mon, 22 Oct 2018 16:47:55 +0000
|
||||||
|
Subject: [PATCH] Fix heap limit checking overflow bug in pcre2_dfa_match().
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
git-svn-id: svn://vcs.exim.org/pcre2/code/trunk@1034 6239d852-aaf2-0410-a92c-79f79f948069
|
||||||
|
|
||||||
|
Petr Písař: Ported to 10.32.
|
||||||
|
|
||||||
|
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
||||||
|
---
|
||||||
|
src/pcre2_dfa_match.c | 22 +++++++++++++---------
|
||||||
|
1 file changed, 13 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/pcre2_dfa_match.c b/src/pcre2_dfa_match.c
|
||||||
|
index 9b43237..818004d 100644
|
||||||
|
--- a/src/pcre2_dfa_match.c
|
||||||
|
+++ b/src/pcre2_dfa_match.c
|
||||||
|
@@ -316,8 +316,8 @@ finding the minimum heap requirement for a match. */
|
||||||
|
|
||||||
|
typedef struct RWS_anchor {
|
||||||
|
struct RWS_anchor *next;
|
||||||
|
- unsigned int size; /* Number of ints */
|
||||||
|
- unsigned int free; /* Number of ints */
|
||||||
|
+ uint32_t size; /* Number of ints */
|
||||||
|
+ uint32_t free; /* Number of ints */
|
||||||
|
} RWS_anchor;
|
||||||
|
|
||||||
|
#define RWS_ANCHOR_SIZE (sizeof(RWS_anchor)/sizeof(int))
|
||||||
|
@@ -413,20 +413,24 @@ if (rws->next != NULL)
|
||||||
|
new = rws->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* All sizes are in units of sizeof(int), except for mb->heaplimit, which is in
|
||||||
|
-kibibytes. */
|
||||||
|
+/* Sizes in the RWS_anchor blocks are in units of sizeof(int), but
|
||||||
|
+mb->heap_limit and mb->heap_used are in kibibytes. Play carefully, to avoid
|
||||||
|
+overflow. */
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
- unsigned int newsize = rws->size * 2;
|
||||||
|
- unsigned int heapleft = (unsigned int)
|
||||||
|
- (((1024/sizeof(int))*mb->heap_limit - mb->heap_used));
|
||||||
|
- if (newsize > heapleft) newsize = heapleft;
|
||||||
|
+ uint32_t newsize = (rws->size >= UINT32_MAX/2)? UINT32_MAX/2 : rws->size * 2;
|
||||||
|
+ uint32_t newsizeK = newsize/(1024/sizeof(int));
|
||||||
|
+
|
||||||
|
+ if (newsizeK + mb->heap_used > mb->heap_limit)
|
||||||
|
+ newsizeK = mb->heap_limit - mb->heap_used;
|
||||||
|
+ newsize = newsizeK*(1024/sizeof(int));
|
||||||
|
+
|
||||||
|
if (newsize < RWS_RSIZE + ovecsize + RWS_ANCHOR_SIZE)
|
||||||
|
return PCRE2_ERROR_HEAPLIMIT;
|
||||||
|
new = mb->memctl.malloc(newsize*sizeof(int), mb->memctl.memory_data);
|
||||||
|
if (new == NULL) return PCRE2_ERROR_NOMEMORY;
|
||||||
|
- mb->heap_used += newsize;
|
||||||
|
+ mb->heap_used += newsizeK;
|
||||||
|
new->next = NULL;
|
||||||
|
new->size = newsize;
|
||||||
|
rws->next = new;
|
||||||
|
--
|
||||||
|
2.17.2
|
||||||
|
|
@ -59,6 +59,9 @@ Patch2: pcre2-10.32-Fix-an-xclass-matching-issue-in-JIT.patch
|
|||||||
# Fix matching a zero-repeated subroutine call at a start of a pattern,
|
# Fix matching a zero-repeated subroutine call at a start of a pattern,
|
||||||
# upstream bug #2332, in upstream after 10.32
|
# upstream bug #2332, in upstream after 10.32
|
||||||
Patch3: pcre2-10.32-Fix-zero-repeated-subroutine-call-at-start-of-patter.patch
|
Patch3: pcre2-10.32-Fix-zero-repeated-subroutine-call-at-start-of-patter.patch
|
||||||
|
# Fix heap limit checking overflow in pcre2_dfa_match(), upstream bug #2334,
|
||||||
|
# in upstream after 10.32
|
||||||
|
Patch4: pcre2-10.32-Fix-heap-limit-checking-overflow-bug-in-pcre2_dfa_ma.patch
|
||||||
BuildRequires: autoconf
|
BuildRequires: autoconf
|
||||||
BuildRequires: automake
|
BuildRequires: automake
|
||||||
BuildRequires: coreutils
|
BuildRequires: coreutils
|
||||||
@ -138,6 +141,7 @@ Utilities demonstrating PCRE2 capabilities like pcre2grep or pcre2test.
|
|||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%patch2 -p1
|
%patch2 -p1
|
||||||
%patch3 -p1
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
# Because of multilib patch
|
# Because of multilib patch
|
||||||
libtoolize --copy --force
|
libtoolize --copy --force
|
||||||
autoreconf -vif
|
autoreconf -vif
|
||||||
@ -242,6 +246,7 @@ make %{?_smp_mflags} check VERBOSE=yes
|
|||||||
* Thu Nov 01 2018 Petr Pisar <ppisar@redhat.com> - 10.32-4
|
* Thu Nov 01 2018 Petr Pisar <ppisar@redhat.com> - 10.32-4
|
||||||
- Fix matching a zero-repeated subroutine call at a start of a pattern
|
- Fix matching a zero-repeated subroutine call at a start of a pattern
|
||||||
(upstream bug #2332)
|
(upstream bug #2332)
|
||||||
|
- Fix heap limit checking overflow in pcre2_dfa_match() (upstream bug #2334)
|
||||||
|
|
||||||
* Mon Sep 24 2018 Petr Pisar <ppisar@redhat.com> - 10.32-3
|
* Mon Sep 24 2018 Petr Pisar <ppisar@redhat.com> - 10.32-3
|
||||||
- Fix caseless matching an extended class in JIT mode (upstream bug #2321)
|
- Fix caseless matching an extended class in JIT mode (upstream bug #2321)
|
||||||
|
Loading…
Reference in New Issue
Block a user