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

Bron Gondwana brong at fastmail.fm
Thu Jun 28 03:23:44 EDT 2012


on phone

Not just your bad. Naming of dlist pointers is shockingly bad. We need a scheme which makes ownership clearer!

Bron.

On Thu, Jun 28, 2012, at 10:24 AM, Greg Banks wrote:
> 
> 
> 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.
-- 
  Bron Gondwana
  brong at fastmail.fm



More information about the Cyrus-devel mailing list