From c922b01f54c4bebe84daeacf014cfbc8dc68479b Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Mon, 27 Apr 2009 11:10:24 -0700 Subject: [PATCH] grep: fix segfault when "git grep '('" is given Signed-off-by: Linus Torvalds Signed-off-by: Junio C Hamano --- grep.c | 8 ++++++-- t/t7002-grep.sh | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/grep.c b/grep.c index 13c18ff65..a4edacad8 100644 --- a/grep.c +++ b/grep.c @@ -54,6 +54,8 @@ static struct grep_expr *compile_pattern_atom(struct grep_pat **list) struct grep_expr *x; p = *list; + if (!p) + return NULL; switch (p->token) { case GREP_PATTERN: /* atom */ case GREP_PATTERN_HEAD: @@ -66,8 +68,6 @@ static struct grep_expr *compile_pattern_atom(struct grep_pat **list) case GREP_OPEN_PAREN: *list = p->next; x = compile_pattern_or(list); - if (!x) - return NULL; if (!*list || (*list)->token != GREP_CLOSE_PAREN) die("unmatched parenthesis"); *list = (*list)->next; @@ -83,6 +83,8 @@ static struct grep_expr *compile_pattern_not(struct grep_pat **list) struct grep_expr *x; p = *list; + if (!p) + return NULL; switch (p->token) { case GREP_NOT: if (!p->next) @@ -361,6 +363,8 @@ static int match_expr_eval(struct grep_opt *o, { int h = 0; + if (!x) + die("Not a valid grep expression"); switch (x->node) { case GREP_NODE_ATOM: h = match_one_pattern(o, x->u.atom, bol, eol, ctx); diff --git a/t/t7002-grep.sh b/t/t7002-grep.sh index 5e359cb56..087bacb89 100755 --- a/t/t7002-grep.sh +++ b/t/t7002-grep.sh @@ -26,6 +26,10 @@ test_expect_success setup ' git commit -m initial ' +test_expect_success 'grep should not segfault with a bad input' ' + test_must_fail git grep "(" +' + for H in HEAD '' do case "$H" in -- 2.30.2