Fix bug introduced at 10.21: use memory allocator from the pattern if no

context is supplied to pcre2_match().
This commit is contained in:
Philip.Hazel 2017-03-25 15:19:49 +00:00
parent 935183d2d5
commit 649ae8f6d5
2 changed files with 14 additions and 8 deletions

View File

@ -88,6 +88,10 @@ encountered a character class with a possessive repeat, for example [a-f]{3}+.
of 10.23/36); pcre2test has been upgraded so that \=find_limits works with DFA of 10.23/36); pcre2test has been upgraded so that \=find_limits works with DFA
matching to find the minimum value for this limit. matching to find the minimum value for this limit.
16. Since 10.21, if pcre2_match() was called with a null context, default
memory allocation functions were used instead of whatever was used when the
pattern was compiled.
Version 10.23 14-February-2017 Version 10.23 14-February-2017
------------------------------ ------------------------------

View File

@ -6084,11 +6084,6 @@ options |= (re->flags & FF) / ((FF & (~FF+1)) / (OO & (~OO+1)));
#undef FF #undef FF
#undef OO #undef OO
/* A NULL match context means "use a default context" */
if (mcontext == NULL)
mcontext = (pcre2_match_context *)(&PRIV(default_match_context));
/* These two settings are used in the code for checking a UTF string that /* These two settings are used in the code for checking a UTF string that
follows immediately afterwards. Other values in the mb block are used only follows immediately afterwards. Other values in the mb block are used only
during interpretive processing, not when the JIT support is in use, so they are during interpretive processing, not when the JIT support is in use, so they are
@ -6156,7 +6151,7 @@ if (utf && (options & PCRE2_NO_UTF_CHECK) == 0)
/* It is an error to set an offset limit without setting the flag at compile /* It is an error to set an offset limit without setting the flag at compile
time. */ time. */
if (mcontext->offset_limit != PCRE2_UNSET && if (mcontext != NULL && mcontext->offset_limit != PCRE2_UNSET &&
(re->overall_options & PCRE2_USE_OFFSET_LIMIT) == 0) (re->overall_options & PCRE2_USE_OFFSET_LIMIT) == 0)
return PCRE2_ERROR_BADOFFSETLIMIT; return PCRE2_ERROR_BADOFFSETLIMIT;
@ -6175,7 +6170,15 @@ if (re->executable_jit != NULL && (options & ~PUBLIC_JIT_MATCH_OPTIONS) == 0)
} }
#endif #endif
/* Carry on with non-JIT matching. */ /* Carry on with non-JIT matching. A NULL match context means "use a default
context", but we take the memory control functions from the pattern. */
if (mcontext == NULL)
{
mcontext = (pcre2_match_context *)(&PRIV(default_match_context));
mb->memctl = re->memctl;
}
else mb->memctl = mcontext->memctl;
anchored = ((re->overall_options | options) & PCRE2_ANCHORED) != 0; anchored = ((re->overall_options | options) & PCRE2_ANCHORED) != 0;
firstline = (re->overall_options & PCRE2_FIRSTLINE) != 0; firstline = (re->overall_options & PCRE2_FIRSTLINE) != 0;
@ -6187,7 +6190,6 @@ bumpalong_limit = (mcontext->offset_limit == PCRE2_UNSET)?
mb->callout = mcontext->callout; mb->callout = mcontext->callout;
mb->callout_data = mcontext->callout_data; mb->callout_data = mcontext->callout_data;
mb->memctl = mcontext->memctl;
mb->start_subject = subject; mb->start_subject = subject;
mb->start_offset = start_offset; mb->start_offset = start_offset;