Carlo Marcelo Arenas Belón <carenas@xxxxxxxxx> writes: > PCRE1 allowed for a compile time flag to disable JIT, but PCRE2 never > had one, forcing the use of JIT if -P was requested. > > After ed0479ce3d (Merge branch 'ab/no-kwset' into next, 2019-07-15) > the PCRE2 engine will be used more broadly and therefore adding this > knob will give users a fallback for situations like the one observed > in OpenBSD with a JIT enabled PCRE2, because of W^X restrictions: > > $ git grep 'foo bar' > fatal: Couldn't JIT the PCRE2 pattern 'foo bar', got '-48' > $ git grep -G 'foo bar' > fatal: Couldn't JIT the PCRE2 pattern 'foo bar', got '-48' > $ git grep -E 'foo bar' > fatal: Couldn't JIT the PCRE2 pattern 'foo bar', got '-48' > $ git grep -F 'foo bar' > fatal: Couldn't JIT the PCRE2 pattern 'foo bar', got '-48' ;-) Yeah, we should have known that security-paranoid distros would have W^X issues with this series, too. I am not sure I like a config-only knob like this, though---shouldn't we have a command line knob to turn jit off first, and then for those who gets tired of having to type it all the time add the configuration to flip the default for them? Other than that, the feature itself makes quite a lot of sense. > > Signed-off-by: Carlo Marcelo Arenas Belón <carenas@xxxxxxxxx> > --- > Documentation/git-grep.txt | 4 ++++ > grep.c | 15 +++++++++++++-- > grep.h | 1 + > 3 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt > index c89fb569e3..ff544bdeec 100644 > --- a/Documentation/git-grep.txt > +++ b/Documentation/git-grep.txt > @@ -69,6 +69,10 @@ grep.fallbackToNoIndex:: > If set to true, fall back to git grep --no-index if git grep > is executed outside of a git repository. Defaults to false. > > +pcre.jit:: > + If set to false, disable JIT when using PCRE. Defaults to > + true. > + > > OPTIONS > ------- > diff --git a/grep.c b/grep.c > index c7c06ae08d..3524d353dd 100644 > --- a/grep.c > +++ b/grep.c > @@ -56,6 +56,7 @@ void init_grep_defaults(struct repository *repo) > opt->repo = repo; > opt->relative = 1; > opt->pathname = 1; > + opt->pcre_jit = 1; > opt->max_depth = -1; > opt->pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED; > color_set(opt->colors[GREP_COLOR_CONTEXT], ""); > @@ -125,6 +126,12 @@ int grep_config(const char *var, const char *value, void *cb) > return 0; > } > > + if (!strcmp(var, "pcre.jit")) { > + int is_bool; > + opt->pcre_jit = git_config_bool_or_int(var, value, &is_bool); > + return 0; > + } > + > if (!strcmp(var, "color.grep")) > opt->color = git_config_colorbool(var, value); > if (!strcmp(var, "color.grep.match")) { > @@ -163,6 +170,7 @@ void grep_init(struct grep_opt *opt, struct repository *repo, const char *prefix > opt->pattern_tail = &opt->pattern_list; > opt->header_tail = &opt->header_list; > > + opt->pcre_jit = def->pcre_jit; > opt->only_matching = def->only_matching; > opt->color = def->color; > opt->extended_regexp_option = def->extended_regexp_option; > @@ -393,7 +401,8 @@ static void compile_pcre1_regexp(struct grep_pat *p, const struct grep_opt *opt) > die("%s", error); > > #ifdef GIT_PCRE1_USE_JIT > - pcre_config(PCRE_CONFIG_JIT, &p->pcre1_jit_on); > + if (opt->pcre_jit) > + pcre_config(PCRE_CONFIG_JIT, &p->pcre1_jit_on); > #endif > } > > @@ -489,7 +498,9 @@ static void compile_pcre2_pattern(struct grep_pat *p, const struct grep_opt *opt > compile_regexp_failed(p, (const char *)&errbuf); > } > > - pcre2_config(PCRE2_CONFIG_JIT, &p->pcre2_jit_on); > + if (opt->pcre_jit) > + pcre2_config(PCRE2_CONFIG_JIT, &p->pcre2_jit_on); > + > if (p->pcre2_jit_on) { > jitret = pcre2_jit_compile(p->pcre2_pattern, PCRE2_JIT_COMPLETE); > if (jitret) > diff --git a/grep.h b/grep.h > index c0c71eb4a9..fff152e606 100644 > --- a/grep.h > +++ b/grep.h > @@ -151,6 +151,7 @@ struct grep_opt { > int allow_textconv; > int extended; > int use_reflog_filter; > + int pcre_jit; > int pcre1; > int pcre2; > int relative;