[PATCH] Fix in-place editing in crlf_to_git and ident_to_git.
- From
Pierre Habouzit <madcoder@debian.org>
- Date
- Oct 5, 2007, 08:20 UTC
- Message-ID
- <20071005082026.GE19879@artemis.corp>
- In-Reply-To
- <87wsu2sad0.fsf@gollum.intra.norang.ca>
When crlf_to_git or ident_to_git are called "in place", the buffer already is big enough and should not be resized (as it could make the buffer address change, hence invalidate the `src' pointers !).
Also fix the growth length at the same time: we want to replace the buffer content (not append) in those functions as they are filters.
Thanks to Bernt Hansen for the bug report.
Signed-off-by: Pierre Habouzit <madcoder@debian.org> ---
This patch is done on top of master, as strbuf's have been merged. This is a major issue.
convert.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/convert.c b/convert.c index 0d5e909..4664197 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 (src != buf->buf) + strbuf_grow(buf, len - buf->len); dst = buf->buf; if (action == CRLF_GUESS) { /* @@ -281,12 +283,12 @@ 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; } @@ -422,7 +424,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 (src != buf->buf) + strbuf_grow(buf, len - buf->len); dst = buf->buf; for (;;) { dollar = memchr(src, '$', len);
-- 1.5.3.4.207.gc79d4-dirty