Build failed in Jenkins: cyrus-imapd-master #674

Greg Banks gnb at fastmail.fm
Wed Jun 27 20:24:41 EDT 2012



On Wed, Jun 27, 2012, at 05:08 PM, Jenkins wrote:
> See <http://ci.cyrusimap.org/job/cyrus-imapd-master/674/>
> 
> --build-url=http://ci.cyrusimap.org/job/cyrus-imapd-master/674/
> Test failures and errors summary
> ================================
> 
> Cassandane::Cyrus::Metadata.specialuse
>     http://ci.cyrusimap.org/job/cyrus-imapd-master/674//testReport/%28root%29/Cassandane__Cyrus__Metadata/test_specialuse/

Lots of tests were failing with "Some process is already listening on
127.0.0.1:9100", the highly annoying Cassandane cascading failure mode.

> Cassandane::Cyrus::Metadata.msg_replication_mod_bot_msl
>     http://ci.cyrusimap.org/job/cyrus-imapd-master/674//testReport/%28root%29/Cassandane__Cyrus__Metadata/test_msg_replication_mod_bot_msl/

This was an actual bug

Error Message
Perl exception: Core files found in /var/tmp/cass/21032384/conf/cores    

Core was generated by
`/var/lib/jenkins/jobs/cyrus-imapd-master/workspace/inst/usr/cyrus/bin/sync_clie'.
Program terminated with signal 6, Aborted.
#0  0x0000003665830265 in raise () from /lib64/libc.so.6
(gdb) bt
#0  0x0000003665830265 in raise () from /lib64/libc.so.6
#1  0x0000003665831d10 in abort () from /lib64/libc.so.6
#2  0x000000366586a84b in __libc_message () from /lib64/libc.so.6
#3  0x000000366587230f in _int_free () from /lib64/libc.so.6
#4  0x000000366587276b in free () from /lib64/libc.so.6
#5  0x00002abf9a6df754 in dlist_free (dlp=0x7fff951d71d8) at
imap/dlist.c:650
#6  0x000000000040a20c in mailbox_full_update (mboxname=0x18d164c0
"user.cassandane") at imap/sync_client.c:1366
#7  0x000000000040ac77 in update_mailbox (local=0x18d15f10,
remote=0x18d16b50, reserve_guids=0x18d16760)
    at imap/sync_client.c:1502
#8  0x000000000040c139 in do_folders (mboxname_list=0x18d14ab0,
replica_folders=0x18d14a90, delete_remote=1)
    at imap/sync_client.c:1825
#9  0x000000000040cc70 in do_user_main (user=0x7fff951d9b0f
"cassandane", replica_folders=0x18d14a90, 
    replica_quota=0x18d15a70) at imap/sync_client.c:2000
#10 0x000000000040d9bf in do_user (userid=0x7fff951d9b0f "cassandane")
at imap/sync_client.c:2204
#11 0x0000000000412588 in main (argc=9, argv=0x7fff951d8768) at
imap/sync_client.c:3246

Hmm

646     void dlist_free(struct dlist **dlp)
647     {
648         if (!*dlp) return;
649         _dlist_clean(*dlp);
650         free((*dlp)->name);   <----
651         free(*dlp);
652         *dlp = NULL;
653     }

1361        mailbox_close(&mailbox);
1362    
1363        dlist_free(&kin);
1364        dlist_free(&kaction);
1365        dlist_free(&kexpunge);
1366        dlist_free(&kuids); <----
1367    
1368        return r;
1369    }

Ah, that line was added recently by Bron on the basis of an analysis I
made on an internal Fastmail mailing list.  Let's look at the code a bit
harder.

1217 static int mailbox_full_update(const char *mboxname)
1218 {
…
1225     struct dlist *kuids = NULL;
…
1321     kexpunge = dlist_newkvlist(NULL, "EXPUNGE");
1322     dlist_setatom(kexpunge, "MBOXNAME", mailbox->name);
1323     dlist_setatom(kexpunge, "UNIQUEID", mailbox->uniqueid); /* just
for safety */
1324     kuids = dlist_newlist(kexpunge, "UID");
1325     for (ka = kaction->head; ka; ka = ka->next) {
1326         if (!strcmp(ka->name, "EXPUNGE")) {
1327             dlist_setnum32(kuids, "UID", dlist_num(ka));
1328         }
1329         else if (!strcmp(ka->name, "COPYBACK")) {
1330             r = copy_remote(mailbox, dlist_num(ka), kr);
1331             if (r) goto cleanup;
1332             dlist_setnum32(kuids, "UID", dlist_num(ka));
1333         }
1334         else if (!strcmp(ka->name, "RENUMBER")) {
1335             r = copy_local(mailbox, dlist_num(ka));
1336             if (r) goto cleanup;
1337         }
1338     }
…
1365     dlist_free(&kexpunge);
1366     dlist_free(&kuids);

Whoops, I was completely wrong about leaking kuids.  Now we are
double-freeing it.  The 'kuids' pointer actually points into the dlist
tree whose root is pointed to by 'kexpunge'.  So we're freeing the kuids
dlists at line 1365, then once more at the new line 1366.  My bad :(

Fixed in commit
http://git.cyrusimap.org/cyrus-imapd/commit/?id=6f10cc844e297d31d2c3ed8ec83a818533cdbf90

-- 
Greg.


More information about the Cyrus-devel mailing list