41 lines
1.5 KiB
Diff
41 lines
1.5 KiB
Diff
From 6f84f3be1cdd3aadacc42007582116d1c2c0a3e4 Mon Sep 17 00:00:00 2001
|
|
From: Paul Eggert <eggert@cs.ucla.edu>
|
|
Date: Fri, 12 Nov 2021 21:30:25 -0800
|
|
Subject: [PATCH] =?UTF-8?q?grep:=20Don=E2=80=99t=20limit=20jitstack=5Fmax?=
|
|
=?UTF-8?q?=20to=20INT=5FMAX?=
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
* src/pcresearch.c (jit_exec): Remove arbitrary INT_MAX limit on JIT
|
|
stack size.
|
|
---
|
|
src/pcresearch.c | 8 +++++++-
|
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/pcresearch.c b/src/pcresearch.c
|
|
index daa0c42..bf966f8 100644
|
|
--- a/src/pcresearch.c
|
|
+++ b/src/pcresearch.c
|
|
@@ -59,10 +59,16 @@ jit_exec (struct pcre_comp *pc, char const *subject, PCRE2_SIZE search_bytes,
|
|
{
|
|
while (true)
|
|
{
|
|
+ /* STACK_GROWTH_RATE is taken from PCRE's src/pcre2_jit_compile.c.
|
|
+ Going over the jitstack_max limit could trigger an int
|
|
+ overflow bug within PCRE. */
|
|
+ int STACK_GROWTH_RATE = 8192;
|
|
+ size_t jitstack_max = SIZE_MAX - (STACK_GROWTH_RATE - 1);
|
|
+
|
|
int e = pcre2_match (pc->cre, (PCRE2_SPTR)subject, search_bytes,
|
|
search_offset, options, pc->data, pc->mcontext);
|
|
if (e == PCRE2_ERROR_JIT_STACKLIMIT
|
|
- && 0 < pc->jit_stack_size && pc->jit_stack_size <= INT_MAX / 2)
|
|
+ && 0 < pc->jit_stack_size && pc->jit_stack_size <= jitstack_max / 2)
|
|
{
|
|
PCRE2_SIZE old_size = pc->jit_stack_size;
|
|
PCRE2_SIZE new_size = pc->jit_stack_size = old_size * 2;
|
|
--
|
|
1.8.3.1
|
|
|