]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'ab/grep-simplify-extended-expression'
authorJunio C Hamano <gitster@pobox.com>
Fri, 21 Oct 2022 18:37:28 +0000 (11:37 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 21 Oct 2022 18:37:28 +0000 (11:37 -0700)
Giving "--invert-grep" and "--all-match" without "--grep" to the
"git log" command resulted in an attempt to access grep pattern
expression structure that has not been allocated, which has been
corrected.

* ab/grep-simplify-extended-expression:
  grep.c: remove "extended" in favor of "pattern_expression", fix segfault

grep.c
grep.h
t/t4202-log.sh

diff --git a/grep.c b/grep.c
index 52a894c989087c70f215fc46d9f17489de546d8c..06eed694936c93a0b0d00c993f0a7c068a71916e 100644 (file)
--- a/grep.c
+++ b/grep.c
@@ -708,6 +708,7 @@ void compile_grep_patterns(struct grep_opt *opt)
 {
        struct grep_pat *p;
        struct grep_expr *header_expr = prep_header_patterns(opt);
+       int extended = 0;
 
        for (p = opt->pattern_list; p; p = p->next) {
                switch (p->token) {
@@ -717,14 +718,14 @@ void compile_grep_patterns(struct grep_opt *opt)
                        compile_regexp(p, opt);
                        break;
                default:
-                       opt->extended = 1;
+                       extended = 1;
                        break;
                }
        }
 
        if (opt->all_match || opt->no_body_match || header_expr)
-               opt->extended = 1;
-       else if (!opt->extended)
+               extended = 1;
+       else if (!extended)
                return;
 
        p = opt->pattern_list;
@@ -790,7 +791,7 @@ void free_grep_patterns(struct grep_opt *opt)
                free(p);
        }
 
-       if (!opt->extended)
+       if (!opt->pattern_expression)
                return;
        free_pattern_expr(opt->pattern_expression);
 }
@@ -971,8 +972,6 @@ static int match_expr_eval(struct grep_opt *opt, struct grep_expr *x,
 {
        int h = 0;
 
-       if (!x)
-               die("Not a valid grep expression");
        switch (x->node) {
        case GREP_NODE_TRUE:
                h = 1;
@@ -1052,7 +1051,7 @@ static int match_line(struct grep_opt *opt,
        struct grep_pat *p;
        int hit = 0;
 
-       if (opt->extended)
+       if (opt->pattern_expression)
                return match_expr(opt, bol, eol, ctx, col, icol,
                                  collect_hits);
 
@@ -1370,7 +1369,7 @@ static int should_lookahead(struct grep_opt *opt)
 {
        struct grep_pat *p;
 
-       if (opt->extended)
+       if (opt->pattern_expression)
                return 0; /* punt for too complex stuff */
        if (opt->invert)
                return 0;
diff --git a/grep.h b/grep.h
index bdcadce61b8027adc760cd6e7fc51aa4e94c3d06..6075f997e68f5594f771123ae62655181278d38e 100644 (file)
--- a/grep.h
+++ b/grep.h
@@ -151,7 +151,6 @@ struct grep_opt {
 #define GREP_BINARY_TEXT       2
        int binary;
        int allow_textconv;
-       int extended;
        int use_reflog_filter;
        int relative;
        int pathname;
index cc15cb4ff62ab4c939b369826e5795e46f218d84..2ce2b41174d501f998b9e9edb4faa8ba969629f6 100755 (executable)
@@ -249,6 +249,15 @@ test_expect_success 'log --grep' '
        test_cmp expect actual
 '
 
+for noop_opt in --invert-grep --all-match
+do
+       test_expect_success "log $noop_opt without --grep is a NOOP" '
+               git log >expect &&
+               git log $noop_opt >actual &&
+               test_cmp expect actual
+       '
+done
+
 cat > expect << EOF
 second
 initial