diff options
author | Pierre Habouzit <madcoder@debian.org> | 2007-10-05 10:11:59 +0200 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2007-10-15 21:38:09 -0400 |
commit | 90d16ec032b20f9f1146f3aceca12165aba3b6d6 (patch) | |
tree | 436cf11651c207c282a6c45a0b1d85d7b483a24e | |
parent | 425b78e886e80f3c9f845edebfb199719a8f2d87 (diff) | |
download | git-90d16ec032b20f9f1146f3aceca12165aba3b6d6.tar.gz |
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>
-rw-r--r-- | convert.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -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); |