[PATCH] lf_to_crlf_filter(): tell the caller we added "\n" when draining
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Dec 16, 2011, 22:43 UTC
- Message-ID
- <7vaa6sgmt3.fsf_-_@alter.siamese.dyndns.org>
- In-Reply-To
- <7viplggoq9.fsf@alter.siamese.dyndns.org>
This can only happen when the input size is multiple of the buffer size of the cascade filter (16k) and ends with an LF, but in such a case, the code forgot to tell the caller that it added the "\n" it could not add during the last round.
Signed-off-by: Junio C Hamano <gitster@pobox.com> ---
convert.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/convert.c b/convert.c index c2c2c11..c028275 100644 --- a/convert.c +++ b/convert.c @@ -879,7 +879,7 @@ int is_null_stream_filter(struct stream_filter *filter) struct lf_to_crlf_filter { struct stream_filter filter; - int want_lf; + unsigned want_lf:1; }; static int lf_to_crlf_filter_fn(struct stream_filter *filter, @@ -895,8 +895,11 @@ static int lf_to_crlf_filter_fn(struct stream_filter *filter, lf_to_crlf->want_lf = 0; } - if (!input) - return 0; /* We've already dealt with the state */ + /* We are told to drain */ + if (!input) { + *osize_p -= o; + return 0; + } count = *isize_p; if (count) { @@ -931,10 +934,9 @@ static struct stream_filter_vtbl lf_to_crlf_vtbl = { static struct stream_filter *lf_to_crlf_filter(void) { - struct lf_to_crlf_filter *lf_to_crlf = xmalloc(sizeof(*lf_to_crlf)); + struct lf_to_crlf_filter *lf_to_crlf = xcalloc(1, sizeof(*lf_to_crlf)); lf_to_crlf->filter.vtbl = &lf_to_crlf_vtbl; - lf_to_crlf->want_lf = 0; return (struct stream_filter *)lf_to_crlf; }
-- 1.7.8.351.g9111b