[evolution-data-server] Make camel_stream_write() try to write all bytes at once



commit bae0c643978a67f5368b6b0e5638b97687ee443a
Author: Milan Crha <mcrha redhat com>
Date:   Mon Feb 9 12:58:09 2015 +0100

    Make camel_stream_write() try to write all bytes at once
    
    The default implementation of CamelStream::write() used
    g_output_stream_write() method, which could write only a partial
    content, returning how many bytes had been actually written. That's
    fine, but not each caller counted with this, thus for example
    a CamelStreamFilter::write() failed when only partial buffer had
    been written, which could cause a silent failure on message send.
    Easier than taking care of the not-whole-buffer-written state
    at each place of the usage is to use g_output_stream_write_all()
    function instead, which fails only on errors.
    
    This had been reported downstream as:
    https://bugzilla.redhat.com/show_bug.cgi?id=1186815

 camel/camel-stream.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)
---
diff --git a/camel/camel-stream.c b/camel/camel-stream.c
index a4270f5..980c70b 100644
--- a/camel/camel-stream.c
+++ b/camel/camel-stream.c
@@ -147,20 +147,25 @@ stream_write (CamelStream *stream,
               GError **error)
 {
        GIOStream *base_stream;
-       gssize n_bytes_written = (gssize) n;
+       gssize n_bytes_written = -1;
 
        base_stream = camel_stream_ref_base_stream (stream);
 
        if (base_stream != NULL) {
                GOutputStream *output_stream;
+               gsize n_written = 0;
 
                output_stream = g_io_stream_get_output_stream (base_stream);
                stream->eos = FALSE;
 
-               n_bytes_written = g_output_stream_write (
-                       output_stream, buffer, n, cancellable, error);
+               if (g_output_stream_write_all (output_stream, buffer, n, &n_written, cancellable, error))
+                       n_bytes_written = (gssize) n_written;
+               else
+                       n_bytes_written = -1;
 
                g_object_unref (base_stream);
+       } else {
+               g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED, _("Cannot write with no base 
stream"));
        }
 
        return n_bytes_written;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]