summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Stedfast <fejj@ximian.com>2004-02-28 15:53:54 +0000
committerJeffrey Stedfast <fejj@src.gnome.org>2004-02-28 15:53:54 +0000
commit832a835b52d2eef4ee538f6029fc6fc59f2af44d (patch)
tree360c4b0f9b37a562e8ae33aa82910cd69979fab8
parent96b6b6ffda9032caf741efd23f0d2773770b2f8b (diff)
downloadgmime-832a835b52d2eef4ee538f6029fc6fc59f2af44d.tar.gz
Shrink buflen down by the number of bytes flushed or we'll loop forever
2004-02-28 Jeffrey Stedfast <fejj@ximian.com> * gmime/gmime-stream-buffer.c (stream_write): Shrink buflen down by the number of bytes flushed or we'll loop forever writing the same block over and over.
-rw-r--r--ChangeLog6
-rw-r--r--gmime/gmime-stream-buffer.c9
2 files changed, 11 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index cbaf5370..e54699b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-02-28 Jeffrey Stedfast <fejj@ximian.com>
+
+ * gmime/gmime-stream-buffer.c (stream_write): Shrink buflen down
+ by the number of bytes flushed or we'll loop forever writing the
+ same block over and over.
+
2004-02-18 Jeffrey Stedfast <fejj@ximian.com>
* gmime/internet-address.c (internet_address_to_string): Check
diff --git a/gmime/gmime-stream-buffer.c b/gmime/gmime-stream-buffer.c
index 31391aaf..b2fe390c 100644
--- a/gmime/gmime-stream-buffer.c
+++ b/gmime/gmime-stream-buffer.c
@@ -201,9 +201,9 @@ stream_write (GMimeStream *stream, char *buf, size_t len)
GMimeStreamBuffer *buffer = (GMimeStreamBuffer *) stream;
ssize_t written = 0, n;
- again:
switch (buffer->mode) {
case GMIME_STREAM_BUFFER_BLOCK_WRITE:
+ again:
n = MIN (BLOCK_BUFFER_LEN - buffer->buflen, len);
memcpy (buffer->buffer + buffer->buflen, buf, n);
buffer->buflen += n;
@@ -211,11 +211,12 @@ stream_write (GMimeStream *stream, char *buf, size_t len)
len -= n;
if (len) {
/* flush our buffer... */
- n = g_mime_stream_write (buffer->source, buffer->buffer, BLOCK_BUFFER_LEN);
- if (n > 0) {
+ if ((n = g_mime_stream_write (buffer->source, buffer->buffer, BLOCK_BUFFER_LEN)) != -1) {
memmove (buffer->buffer, buffer->buffer + n, BLOCK_BUFFER_LEN - n);
+ buffer->buflen -= n;
goto again;
- }
+ } else
+ return -1;
}
break;
default: