Re: segfault in mailmbox_append_message_list_no_lock / mmap full mbox
DINH Viet Hoa <[email protected]> Wed, 15 Mar 2006 10:39:41 +0100
| Newsgroups | gmane.mail.libetpan.user |
|---|---|
| Message-ID | <etPan.4417e0dd.14bfb086.496a@utopia> |
Florian Lohoff wrote :
> > > i am getting segfaults in mailmbox_append_message_list_no_lock with a
> > > simple application of mine copying folder contents from maildir to an
> > > mbox. This does happen irregularly so i compiled libetpan with debugging
> > > symbols and let it run. Over the day it copied 66k mails to the mbox
> > > before crashing.
> >
> > can you show your code ?
>
> 29 struct mailfolder *folder_open(char *mfolder) {
> 30 struct mailstorage *storage;
> 31 struct mailfolder *folder;
> 32
> 33 assert(storage=mailstorage_new(NULL));
> 34
> 35 if (mfolder[strlen(mfolder)-1] == '/')
> 36 assert(maildir_mailstorage_init(storage, mfolder, 0, NULL, NULL) == 0);
> 37 else
> 38 assert(mbox_mailstorage_init(storage, mfolder, 0, NULL, NULL) == 0);
> 39
> 40 assert(folder=mailfolder_new(storage, mfolder, NULL));
at this point, you need to use mailstorage_connect(storage) before
mailfolder_connect(folder). Tell me about your results.
> 41
> 42 assert(mailfolder_connect(folder) == 0);
> 43
> 44 return(folder);
> 45 }
>
> 64 inf=folder_open(inbox);
> 65 outf=folder_open(outbox);
> 66
> 67 if (hdrfile) {
> 68 if (hdrfile[0] == '-')
> 69 hdrfd=STDOUT_FILENO;
> 70 else {
> 71 hdrfd=open(hdrfile, O_RDWR|O_APPEND|O_CREAT, 0644);
> 72 if (hdrfd < 0) {
> 73 fprintf(stderr, "Unable to open %s as hdrfile\n", hdrfile) ;
> 74 return 0;
> 75 }
> 76 }
> 77 }
> 78
> 79 assert(mailsession_get_messages_list(inf->fld_session, &env_list) == 0);
> 80
> 81 for(i=0;i<carray_count(env_list->msg_tab);i++) {
> 82 mailmessage *msg;
> 83 msg=carray_get(env_list->msg_tab, i);
> 84
> 85 mailmessage_get_flags(msg, &flags);
> 86
> 87 if (flags && flags->fl_flags & MAIL_FLAG_DELETED)
> 88 continue;
> 89
> 90 if (mailmessage_fetch(msg, &msgbuf, &msglen) != MAIL_NO_ERROR) {
> 91 fprintf(stderr, "Failed to fetch message %d from %s\n", i, outbox) ;
> 92 break;
> 93 }
> 94
>
> This one crashes - As i showed on the gdb backtrace it tries to write to memory
> regions which it did not mmaped successfully.
>
> 95 r=mailfolder_append_message_flags(outf, msgbuf, msglen, msg->msg_flags);
> 96 mailmessage_fetch_result_free(msg, msgbuf);
> 97
> 98 if (r != MAIL_NO_ERROR) {
> 99 fprintf(stderr, "Failed to append message %d to %s error %d\n", i, outbox, r);
> 100 break;
> 101 }
> 102
> 103 if (delete) {
> 104 flags->fl_flags |= MAIL_FLAG_DELETED;
> 105 mailmessage_check(msg);
> 106 }
> 108 if (hdrfile) {
> 109 char xsize[64];
> 110 if (mailmessage_fetch_header(msg, &hdrbuf, &hdrlen) != MAIL_NO_ERR OR) {
> 111 fprintf(stderr, "Failed to fetch message hdr - %d %s\n", i , inbox);
> 112 break;
> 113 }
> 114 i=sprintf(xsize, "X-MailSize: %lu\n", msglen);
> 115 r=write(hdrfd, &xsize, i);
> 116 if (r != i) {
> 117 fprintf(stderr, "Error while writing %d bytes to hdrfile\n ", i+1);
> 118 break;
> 119 }
> 120 r=write(hdrfd, hdrbuf, hdrlen);
> 121 mailmessage_fetch_result_free(msg, hdrbuf);
> 122 if (r != hdrlen) {
> 123 fprintf(stderr, "Error while writing %d bytes to hdrfile\n ", hdrlen);
> 124 break;
> 125 }
> 126 }
> 127
> 128
> 129 mailmessage_flush(msg);
> 130 }
> 131
> 132 mailmessage_list_free(env_list);
--
DINH V. Hoa,
"c'est un peu comme les crampons au foot au début t'as des ampoules
et après non" -- sunZ
signature.asc
(application/pgp-signature, 189 B)
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQBEF+E/7w+pfAWHa3MRAiqZAJ0SAyontIwzXhai7XF1f3GjPjhcigCff+45 ZUzDi3XMHWM8XWhPc40rdBU= =D5dg -----END PGP SIGNATURE-----