tog: fix crash in expand_tab while searching in diff/blame views found by op@ ok op@ tracey@
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
diff --git a/tog/tog.c b/tog/tog.c
index 7abd8ac..70cd6b4 100644
--- a/tog/tog.c
+++ b/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;