rendered paste bodyLog
[[[
Fix translating stream.
* subversion/libsvn_subr/subst.c
(translate_chunk): Mark buffers as flushed after flushing.
(translated_stream_read): Don't return bytes past the end of the buffer
by correctly calculating the remaining number of bytes.
]]]
Index: subversion/libsvn_subr/subst.c
===================================================================
--- subversion/libsvn_subr/subst.c (revision 17720)
+++ subversion/libsvn_subr/subst.c (working copy)
@@ -1018,12 +1018,19 @@
else
{
if (b->newline_off)
- SVN_ERR (translate_newline (b->eol_str, b->eol_str_len, b->src_format,
- &b->src_format_len, b->newline_buf,
- b->newline_off, dst, b->repair));
+ {
+ SVN_ERR (translate_newline (b->eol_str, b->eol_str_len,
+ b->src_format, &b->src_format_len,
+ b->newline_buf, b->newline_off,
+ dst, b->repair));
+ b->newline_off = 0;
+ }
if (b->keyword_off)
- SVN_ERR (translate_write (dst, b->keyword_buf, b->keyword_off));
+ {
+ SVN_ERR (translate_write (dst, b->keyword_buf, b->keyword_off));
+ b->keyword_off = 0;
+ }
}
return SVN_NO_ERROR;
@@ -1076,6 +1083,7 @@
while (readlen == SVN__STREAM_CHUNK_SIZE && unsatisfied > 0)
{
apr_size_t to_copy;
+ apr_size_t buffer_remainder;
svn_pool_clear (iterpool);
/* fill read buffer, if necessary */
@@ -1099,8 +1107,9 @@
}
/* Satisfy from the read buffer */
- to_copy = (b->readbuf->len > unsatisfied)
- ? unsatisfied : b->readbuf->len;
+ buffer_remainder = b->readbuf->len - b->readbuf_off;
+ to_copy = (buffer_remainder > unsatisfied)
+ ? unsatisfied : buffer_remainder;
memcpy (buffer + off, b->readbuf->data + b->readbuf_off, to_copy);
off += to_copy;
b->readbuf_off += to_copy;