[balsa/gtk3] Fix accessing MBox files > 2 GByte



commit 5cbd4b9e926320dfacd14b441013035e9b10f567
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Fri May 27 22:35:29 2016 -0400

    Fix accessing MBox files > 2 GByte
    
        * libbalsa/mailbox_mbox.c (lbm_mbox_check_file),
        (lbm_mbox_newline), (lbm_mbox_add_message): use 64-bit sizes;
        * libbalsa/send.c (libbalsa_message_cb): comment about file size
        limitation.

 ChangeLog               |    9 +++++++++
 libbalsa/mailbox_mbox.c |   30 +++++++++++++++++-------------
 libbalsa/send.c         |    2 ++
 3 files changed, 28 insertions(+), 13 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index d7603e3..603a1aa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2016-05-27  Albrecht Dreß
+
+       Fix accessing MBox files > 2 GByte
+
+       * libbalsa/mailbox_mbox.c (lbm_mbox_check_file),
+       (lbm_mbox_newline), (lbm_mbox_add_message): use 64-bit sizes;
+       * libbalsa/send.c (libbalsa_message_cb): comment about file size
+       limitation.
+
 2016-05-24  Albrecht Dreß
 
        Use G_{BEGIN,END}_DECLS
diff --git a/libbalsa/mailbox_mbox.c b/libbalsa/mailbox_mbox.c
index b59b98d..fc946e0 100644
--- a/libbalsa/mailbox_mbox.c
+++ b/libbalsa/mailbox_mbox.c
@@ -112,7 +112,7 @@ struct _LibBalsaMailboxMbox {
 
     GPtrArray *msgno_2_msg_info;
     GMimeStream *gmime_stream;
-    gint size;
+    off_t size;
     gboolean messages_info_changed;
 };
 
@@ -919,10 +919,10 @@ lbm_mbox_check_file(LibBalsaMailboxMbox * mbox,
 
         if (content_length) {
             /* Seek past the content. */
-            ssize_t remaining;
+            off_t remaining;
 
             buffer->start += content_length;
-            remaining = buffer->end - buffer->start;
+            remaining = (off_t) buffer->end - (off_t) buffer->start;
             if (remaining < 0) {
                 g_mime_stream_seek(buffer->stream, -remaining,
                                    GMIME_STREAM_SEEK_CUR);
@@ -1165,15 +1165,19 @@ static gint
 lbm_mbox_newline(GMimeStream * stream)
 {
     gint retval;
-    gchar buf[1];
-    static gchar newlines[] = "\n\n";
+    static const gchar newlines[] = "\n\n";
 
-    retval = g_mime_stream_seek(stream, -1, GMIME_STREAM_SEEK_CUR);
-    if (retval >= 0)
-       retval = g_mime_stream_read(stream, buf, 1);
-    if (retval == 1)
-       retval =
-           g_mime_stream_write(stream, newlines, buf[0] == '\n' ? 1 : 2);
+    if (g_mime_stream_seek(stream, -1, GMIME_STREAM_SEEK_CUR) < 0) {
+       retval = -1;
+    } else {
+        gchar buf;
+
+       retval = g_mime_stream_read(stream, &buf, 1);
+       if (retval == 1) {
+               retval =
+                       g_mime_stream_write(stream, newlines, buf == '\n' ? 1 : 2);
+       }
+    }
 
     return retval;
 }
@@ -1949,7 +1953,7 @@ lbm_mbox_add_message(LibBalsaMailboxLocal * local,
     GMimeObject *armored_object;
     GMimeStream *armored_dest;
     GMimeStream *dest;
-    gint retval;
+    off_t retval;
     off_t orig_length;
 
     message = libbalsa_message_new();
diff --git a/libbalsa/send.c b/libbalsa/send.c
index 2122035..e4e47eb 100644
--- a/libbalsa/send.c
+++ b/libbalsa/send.c
@@ -593,6 +593,8 @@ libbalsa_message_cb (void **buf, int *len, void *arg)
        return NULL;
     }
 
+    /* note: the following calculation works *only* for messages < 2 GB
+     * due to the limited range of int, but this should be safe... */
     *len = g_mime_stream_length(current_message->stream)
            - g_mime_stream_tell(current_message->stream);
     ptr = (char *) mem_stream->buffer->data


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