Hi,
at least mutt 1.5.20 and 1.5.21 (but not 1.5.18) have some issues with mbox
files > 2 GB size.
the attached patch below fixes these issues (at least for me;), maybe that's
also the same fix for ticket #3487 ?!
try:
open mbox file with size >2GB,
select a mail which is positioned >2 GB in that mbox,
open that mail (press return) ==> mail gets displayed ok.
press "q" to return to subject browser, and open the same mail again with
"return": mail display is broken.
or: bouncing a mail with pos >2GB works *only* iff you do not display the mail
before bouncing.
if the mail first got displayed, the process of bouncing sends some trash
snipps from the mbox.
some debugging showed (for 1.5.21):
in mutt_copy_header() in copy.c when calling mutt_copy_hdr() the value of
"h->content->offset"
got trashed (was negative) for the 2nd (broken) display of mails with pos >2GB.
fixing some "long" types to "LOFF_T" mutt.h smime.c and handler.c fixed at
least that displaying errors.
doing some more code inspection for "long" types suggests that there might be
similar issues
in crypt-gpgme.c pgp.c mh.c (not 100% sure, please check!).
the attached diff for mutt-1.5.21 (all changes included) applies to and builds
fine with mutt 1.5.20 too,
and solves the display problem there, too...
Harald Koenig
--
"I hope to die ___ _____
before I *have* to use Microsoft Word.", 0--,| /OOOOOOO\
Donald E. Knuth, 02-Oct-2001 in Tuebingen. <_/ / /OOOOOOOOOOO\
\ \/OOOOOOOOOOOOOOO\
\ OOOOOOOOOOOOOOOOO|//
Harald Koenig \/\/\/\/\/\/\/\/\/
science+computing ag // / \\ \
[email protected] ^^^^^ ^^^^^
--
Vorstand/Board of Management:
Dr. Bernd Finkbeiner, Dr. Roland Niemeier,
Dr. Arno Steitz, Dr. Ingrid Zech
Vorsitzender des Aufsichtsrats/
Chairman of the Supervisory Board:
Michel Lepert
Sitz/Registered Office: Tuebingen
Registergericht/Registration Court: Stuttgart
Registernummer/Commercial Register No.: HRB 382196
diff -ur orig.010003/mutt-1.5.21/crypt-gpgme.c mutt-1.5.21/crypt-gpgme.c
--- orig.010003/mutt-1.5.21/crypt-gpgme.c 2010-09-13 19:19:55.000000000
+0200
+++ mutt-1.5.21/crypt-gpgme.c 2011-03-02 18:18:01.000000000 +0100
@@ -461,7 +461,7 @@
/* Create a GPGME data object from the stream FP but limit the object
to LENGTH bytes starting at OFFSET bytes from the beginning of the
file. */
-static gpgme_data_t file_to_data_object (FILE *fp, long offset, long length)
+static gpgme_data_t file_to_data_object (FILE *fp, LOFF_T offset, long length)
{
int err = 0;
gpgme_data_t data;
@@ -2156,7 +2156,7 @@
{
int needpass = -1, pgp_keyblock = 0;
int clearsign = 0;
- long start_pos = 0;
+ LOFF_T start_pos = 0;
long bytes;
LOFF_T last_pos, offset;
char buf[HUGE_STRING];
diff -ur orig.010003/mutt-1.5.21/handler.c mutt-1.5.21/handler.c
--- orig.010003/mutt-1.5.21/handler.c 2009-08-25 21:08:52.000000000 +0200
+++ mutt-1.5.21/handler.c 2011-03-02 18:12:28.000000000 +0100
@@ -1520,7 +1520,7 @@
FILE *fp = NULL;
char tempfile[_POSIX_PATH_MAX];
handler_t handler = NULL;
- long tmpoffset = 0;
+ LOFF_T tmpoffset = 0;
size_t tmplength = 0;
char type[STRING];
int rc = 0;
diff -ur orig.010003/mutt-1.5.21/mh.c mutt-1.5.21/mh.c
--- orig.010003/mutt-1.5.21/mh.c 2010-08-24 18:34:21.000000000 +0200
+++ mutt-1.5.21/mh.c 2011-03-02 18:48:36.000000000 +0100
@@ -1493,9 +1493,9 @@
char newpath[_POSIX_PATH_MAX];
char partpath[_POSIX_PATH_MAX];
- long old_body_offset = h->content->offset;
- long old_body_length = h->content->length;
- long old_hdr_lines = h->lines;
+ LOFF_T old_body_offset = h->content->offset;
+ LOFF_T old_body_length = h->content->length;
+ LOFF_T old_hdr_lines = h->lines;
if ((dest = mx_open_new_message (ctx, h, 0)) == NULL)
return -1;
diff -ur orig.010003/mutt-1.5.21/mutt.h mutt-1.5.21/mutt.h
--- orig.010003/mutt-1.5.21/mutt.h 2010-09-13 19:19:55.000000000 +0200
+++ mutt-1.5.21/mutt.h 2011-03-02 17:52:03.000000000 +0100
@@ -625,7 +625,7 @@
PARAMETER *parameter; /* parameters of the content-type */
char *description; /* content-description */
char *form_name; /* Content-Disposition form-data name param */
- long hdr_offset; /* offset in stream where the headers begin.
+ LOFF_T hdr_offset; /* offset in stream where the headers begin.
* this info is used when invoking metamail,
* where we need to send the headers of the
* attachment
diff -ur orig.010003/mutt-1.5.21/pgp.c mutt-1.5.21/pgp.c
--- orig.010003/mutt-1.5.21/pgp.c 2010-09-13 19:19:55.000000000 +0200
+++ mutt-1.5.21/pgp.c 2011-03-02 18:48:08.000000000 +0100
@@ -251,7 +251,7 @@
int needpass = -1, pgp_keyblock = 0;
int clearsign = 0, rv, rc;
int c = 1; /* silence GCC warning */
- long start_pos = 0;
+ LOFF_T start_pos = 0;
long bytes;
LOFF_T last_pos, offset;
char buf[HUGE_STRING];
diff -ur orig.010003/mutt-1.5.21/smime.c mutt-1.5.21/smime.c
--- orig.010003/mutt-1.5.21/smime.c 2010-09-13 19:19:55.000000000 +0200
+++ mutt-1.5.21/smime.c 2011-03-02 18:12:08.000000000 +0100
@@ -1546,7 +1546,7 @@
pid_t thepid;
int badsig = -1;
- long tmpoffset = 0;
+ LOFF_T tmpoffset = 0;
size_t tmplength = 0;
int origType = sigbdy->type;
char *savePrefix = NULL;
@@ -1660,7 +1660,7 @@
{
int len=0;
int c;
- long last_pos;
+ LOFF_T last_pos;
char buf[HUGE_STRING];
char outfile[_POSIX_PATH_MAX], errfile[_POSIX_PATH_MAX];
char tmpfname[_POSIX_PATH_MAX];
@@ -1865,7 +1865,7 @@
char tempfile[_POSIX_PATH_MAX];
STATE s;
- long tmpoffset = b->offset;
+ LOFF_T tmpoffset = b->offset;
size_t tmplength = b->length;
int origType = b->type;
FILE *tmpfp=NULL;