summaryrefslogtreecommitdiff
path: root/convert.c
diff options
context:
space:
mode:
authorPierre Habouzit <madcoder@debian.org>2007-10-05 08:11:59 (GMT)
committerShawn O. Pearce <spearce@spearce.org>2007-10-16 01:38:09 (GMT)
commit90d16ec032b20f9f1146f3aceca12165aba3b6d6 (patch)
tree436cf11651c207c282a6c45a0b1d85d7b483a24e /convert.c
parent425b78e886e80f3c9f845edebfb199719a8f2d87 (diff)
downloadgit-90d16ec032b20f9f1146f3aceca12165aba3b6d6.zip
git-90d16ec032b20f9f1146f3aceca12165aba3b6d6.tar.gz
git-90d16ec032b20f9f1146f3aceca12165aba3b6d6.tar.bz2
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>
Diffstat (limited to 'convert.c')
-rw-r--r--convert.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/convert.c b/convert.c
index 0d5e909..aa95834 100644
--- a/convert.c
+++ b/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);