Fix in-place editing functions in convert.c
* crlf_to_git and ident_to_git: Don't grow the buffer if there is enough space in the first place. As a side effect, when the editing is done "in place", we don't grow, so the buffer pointer doesn't changes, and `src' isn't invalidated anymore. Thanks to Bernt Hansen for the bug report. * apply_filter: Fix memory leak due to fake in-place editing that didn't collected the old buffer when the filter succeeds. Also a cosmetic fix. Signed-off-by: Pierre Habouzit <madcoder@debian.org> Signed-off-by: Lars Hjemli <hjemli@gmail.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
parent
425b78e886
commit
90d16ec032
17
convert.c
17
convert.c
@ -110,7 +110,9 @@ static int crlf_to_git(const char *path, const char *src, size_t len,
|
||||
return 0;
|
||||
}
|
||||
|
||||
strbuf_grow(buf, len);
|
||||
/* only grow if not in place */
|
||||
if (strbuf_avail(buf) + buf->len < len)
|
||||
strbuf_grow(buf, len - buf->len);
|
||||
dst = buf->buf;
|
||||
if (action == CRLF_GUESS) {
|
||||
/*
|
||||
@ -281,20 +283,19 @@ static int apply_filter(const char *path, const char *src, size_t len,
|
||||
ret = 0;
|
||||
}
|
||||
if (close(pipe_feed[0])) {
|
||||
ret = error("read from external filter %s failed", cmd);
|
||||
error("read from external filter %s failed", cmd);
|
||||
ret = 0;
|
||||
}
|
||||
status = finish_command(&child_process);
|
||||
if (status) {
|
||||
ret = error("external filter %s failed %d", cmd, -status);
|
||||
error("external filter %s failed %d", cmd, -status);
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
*dst = nbuf;
|
||||
} else {
|
||||
strbuf_release(&nbuf);
|
||||
strbuf_swap(dst, &nbuf);
|
||||
}
|
||||
strbuf_release(&nbuf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -422,7 +423,9 @@ static int ident_to_git(const char *path, const char *src, size_t len,
|
||||
if (!ident || !count_ident(src, len))
|
||||
return 0;
|
||||
|
||||
strbuf_grow(buf, len);
|
||||
/* only grow if not in place */
|
||||
if (strbuf_avail(buf) + buf->len < len)
|
||||
strbuf_grow(buf, len - buf->len);
|
||||
dst = buf->buf;
|
||||
for (;;) {
|
||||
dollar = memchr(src, '$', len);
|
||||
|
Loading…
Reference in New Issue
Block a user