changeset 2756:9cd5d91509bb HEAD

Growing output buffer size broke the data inside it.
author Timo Sirainen <tss@iki.fi>
date Sat, 16 Oct 2004 19:32:09 +0300
parents 13c70c53cb55
children b0e039ad5717
files src/lib/ostream-file.c
diffstat 1 files changed, 6 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/ostream-file.c	Sat Oct 16 17:59:32 2004 +0300
+++ b/src/lib/ostream-file.c	Sat Oct 16 19:32:09 2004 +0300
@@ -296,7 +296,7 @@
 
 static void o_stream_grow_buffer(struct file_ostream *fstream, size_t bytes)
 {
-	size_t size, head_size, new_size;
+	size_t size, new_size, end_size;
 
 	size = nearest_power(fstream->buffer_size + bytes);
 	if (size > fstream->max_buffer_size) {
@@ -318,17 +318,11 @@
 				    fstream->buffer_size, size);
 
 	if (fstream->tail <= fstream->head && !IS_STREAM_EMPTY(fstream)) {
-		head_size = I_MIN(fstream->head, size - fstream->buffer_size);
-		memcpy(fstream->buffer + fstream->buffer_size, fstream->buffer,
-		       head_size);
-
-		if (head_size == fstream->head)
-			fstream->tail = fstream->buffer_size + head_size;
-		else {
-			memmove(fstream->buffer, fstream->buffer + head_size,
-				fstream->head - head_size);
-			fstream->tail = fstream->head - head_size;
-		}
+		/* move head forward to end of buffer */
+		end_size = fstream->buffer_size - fstream->head;
+		memmove(fstream->buffer + size - end_size,
+			fstream->buffer + fstream->head, end_size);
+		fstream->head = size - end_size;
 	}
 
 	fstream->full = FALSE;