commit cb7135077d54730dd9db4241233fcffdb77bd996 from: Stefan Sperling date: Thu Jun 16 20:55:21 2022 UTC tog: fix crash in expand_tab while searching in diff/blame views found by op@ ok op@ tracey@ commit - 1853e0f4252bee193b48a934d269ecf11d6283fd commit + cb7135077d54730dd9db4241233fcffdb77bd996 blob - 7abd8ac2deaa36fa7cc9dc16462f7acb50b71f78 blob + 70cd6b4ee7926488e95647af7307e20a3b9278ee --- tog/tog.c +++ tog/tog.c @@ -3717,7 +3717,7 @@ search_next_diff_view(struct tog_view *view) struct tog_diff_view_state *s = &view->state.diff; const struct got_error *err = NULL; int lineno; - char *exstr = NULL, *line = NULL; + char *line = NULL; size_t linesize = 0; ssize_t linelen; @@ -3755,24 +3755,26 @@ search_next_diff_view(struct tog_view *view) return got_error_from_errno("fseeko"); } linelen = getline(&line, &linesize, s->f); - err = expand_tab(&exstr, line); - if (err) - break; - if (linelen != -1 && - match_line(exstr, &view->regex, 1, &view->regmatch)) { - view->search_next_done = TOG_SEARCH_HAVE_MORE; - s->matched_line = lineno; - break; + if (linelen != -1) { + char *exstr; + err = expand_tab(&exstr, line); + if (err) + break; + if (match_line(exstr, &view->regex, 1, + &view->regmatch)) { + view->search_next_done = TOG_SEARCH_HAVE_MORE; + s->matched_line = lineno; + free(exstr); + break; + } + free(exstr); } - free(exstr); - exstr = NULL; if (view->searching == TOG_SEARCH_FORWARD) lineno++; else lineno--; } free(line); - free(exstr); if (s->matched_line) { s->first_displayed_line = s->matched_line; @@ -4844,7 +4846,7 @@ search_next_blame_view(struct tog_view *view) struct tog_blame_view_state *s = &view->state.blame; const struct got_error *err = NULL; int lineno; - char *exstr = NULL, *line = NULL; + char *line = NULL; size_t linesize = 0; ssize_t linelen; @@ -4882,24 +4884,26 @@ search_next_blame_view(struct tog_view *view) return got_error_from_errno("fseeko"); } linelen = getline(&line, &linesize, s->blame.f); - err = expand_tab(&exstr, line); - if (err) - break; - if (linelen != -1 && - match_line(exstr, &view->regex, 1, &view->regmatch)) { - view->search_next_done = TOG_SEARCH_HAVE_MORE; - s->matched_line = lineno; - break; + if (linelen != -1) { + char *exstr; + err = expand_tab(&exstr, line); + if (err) + break; + if (match_line(exstr, &view->regex, 1, + &view->regmatch)) { + view->search_next_done = TOG_SEARCH_HAVE_MORE; + s->matched_line = lineno; + free(exstr); + break; + } + free(exstr); } - free(exstr); - exstr = NULL; if (view->searching == TOG_SEARCH_FORWARD) lineno++; else lineno--; } free(line); - free(exstr); if (s->matched_line) { s->first_displayed_line = s->matched_line;