On 03/16/2015 01:39 PM, Lee Howard wrote:
Something appears to be corrupt with one user's inbox and this is causing dbmail-export to segfault.

dbmail-util does not seem to fix the problem.

The user cannot retrieve any mail via dbmail-imapd or dbmail-pop3d although imapd does show messages available.

Other users are not experiencing any problem. So it would seem to be something corrupt in the database for the one user.

The dbmail-export segfault is fixed by the attached patch. dbmail_message_retrieve() can return NULL, and this condition was not being handled.

I note that a NULL return from dbmail_message_retrieve() is also not handled in both src/dm_http.c and src/maintenance.c, but I did not address these since my immediate use would not have allowed me to test any code changes to there. I will leave that to you.

dbmail-util was not repairing the problem with the offending/corrupt mail message.

To resolve the problem I merely had dbmail-export printf the physmessage_id number of the message that caused dbmail_message_retrieve() to return NULL (123258), and then I did:

MariaDB [dbmail]> delete from dbmail_physmessage where id = '123258';
Query OK, 1 row affected (0.07 sec)

Once that was done then my e-mail client was able to retrieve all of the backlogged e-mail as normal and expected.

I am not entirely certain what was wrong with that one message. I did note that:

MariaDB [dbmail]> select * from dbmail_partlists where physmessage_id = '123258';
Empty set (0.00 sec)

Since I'm not an expert on the way dbmail expects a mail to be represented in the database I'm not sure if that was the offending matter.

However, I would like to see dbmail-util resolve this condition. I would much-prefer to just run dbmail-util than to run hard-code a printf into dbmail-export and then delete a record from the database. What can I do?

Thanks,

Lee.
--- src/dm_mailbox.c.orig	2015-03-17 13:02:42.682133322 -0700
+++ src/dm_mailbox.c	2015-03-17 13:00:41.356141081 -0700
@@ -226,7 +226,7 @@
 		mempool_push(self->pool, p_list_data(ids), sizeof(uint64_t));
 		m = dbmail_message_new(self->pool);
 		m = dbmail_message_retrieve(m, physid);
-		if (dump_message_to_stream(self, m, ostream) > 0)
+		if (m && dump_message_to_stream(self, m, ostream) > 0)
 			count++;
 		dbmail_message_free(m);
 
_______________________________________________
Dbmail-dev mailing list
Dbmail-dev@dbmail.org
http://mailman.fastxs.nl/cgi-bin/mailman/listinfo/dbmail-dev

Reply via email to