Browse Source

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>
maint
Pierre Habouzit 17 years ago committed by Shawn O. Pearce
parent
commit
90d16ec032
  1. 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…
Cancel
Save