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;
|
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;
|
dst = buf->buf;
|
||||||
if (action == CRLF_GUESS) {
|
if (action == CRLF_GUESS) {
|
||||||
/*
|
/*
|
||||||
@ -281,20 +283,19 @@ static int apply_filter(const char *path, const char *src, size_t len,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
if (close(pipe_feed[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;
|
ret = 0;
|
||||||
}
|
}
|
||||||
status = finish_command(&child_process);
|
status = finish_command(&child_process);
|
||||||
if (status) {
|
if (status) {
|
||||||
ret = error("external filter %s failed %d", cmd, -status);
|
error("external filter %s failed %d", cmd, -status);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
*dst = nbuf;
|
strbuf_swap(dst, &nbuf);
|
||||||
} else {
|
|
||||||
strbuf_release(&nbuf);
|
|
||||||
}
|
}
|
||||||
|
strbuf_release(&nbuf);
|
||||||
return ret;
|
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))
|
if (!ident || !count_ident(src, len))
|
||||||
return 0;
|
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;
|
dst = buf->buf;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
dollar = memchr(src, '$', len);
|
dollar = memchr(src, '$', len);
|
||||||
|
Loading…
Reference in New Issue
Block a user