diff options
author | Jeffrey Stedfast <fejj@ximian.com> | 2004-02-28 15:53:54 +0000 |
---|---|---|
committer | Jeffrey Stedfast <fejj@src.gnome.org> | 2004-02-28 15:53:54 +0000 |
commit | 832a835b52d2eef4ee538f6029fc6fc59f2af44d (patch) | |
tree | 360c4b0f9b37a562e8ae33aa82910cd69979fab8 | |
parent | 96b6b6ffda9032caf741efd23f0d2773770b2f8b (diff) | |
download | gmime-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-- | ChangeLog | 6 | ||||
-rw-r--r-- | gmime/gmime-stream-buffer.c | 9 |
2 files changed, 11 insertions, 4 deletions
@@ -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: |