From e896d8b0ecda036233dfa20ac0b17a6ac3d65431 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Fri, 12 Nov 2021 21:30:25 -0800 Subject: [PATCH 03/12] =?UTF-8?q?grep:=20Don=E2=80=99t=20limit=20jitstack?= =?UTF-8?q?=5Fmax=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; -- 2.32.0