diff options
| author | Bryce Kwon <bryce@brycekwon.com> | |
|---|---|---|
| committer | Bryce Kwon <bryce@brycekwon.com> | |
| commit | ||
| parent | ||
| tree | ||
| download | ||
Answer the plain view once for duplicate entries
A tree can hold two entries of one name when fsck is off, and the walk
went on after the first answered: a second file put two responses in
one body, and a directory under the same name printed headers from the
mimetype string the first had already freed.
Diffstat (limited to '')
| -rw-r--r-- | source/ui-plain.c | 8 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 file changed, 7 insertions, 1 deletion
diff --git a/source/ui-plain.c b/source/ui-plain.c index 67b2044..57e4699 100644 --- a/source/ui-plain.c +++ b/source/ui-plain.c @@ -84,7 +84,9 @@ static void print_object(const struct object_id *oid, const char *path) ctx.page.size = size; cgit_print_http_headers(); html_raw(buf, size); - free(mimetype); + // ctx.page.mimetype may still point into mimetype, and the headers + // are read again by whatever renders after this, so it stays alive + // for the rest of the request. free(buf); } @@ -166,6 +168,10 @@ static int walk_tree(const struct object_id *oid, struct strbuf *base, { struct walk_tree_context *walk = context; + // A tree can hold two entries of one name, and only the first answers: + // a second response would follow the first in the same body. + if (walk->response != RESPONSE_NONE && walk->dir_len >= 0 && base->len == (size_t)walk->dir_len) + return 0; if (walk->dir_len >= 0 && base->len == (size_t)walk->dir_len) { if (S_ISREG(mode) || S_ISLNK(mode)) { print_object(oid, pathname); |
