From: Michal Rakowski Date: Thu, 12 Nov 2020 09:11:38 +0000 (+0100) Subject: Fix #6940 about bscan segfaulting X-Git-Tag: Release-11.3.2~842 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cd97e17f1c29076c069fb37c5ffda4115e814797;p=thirdparty%2Fbacula.git Fix #6940 about bscan segfaulting Needed to move free_dcr() outside of bscan_free_jcr() callback because some jcr's were deleted during traversing of dcr's list. --- diff --git a/bacula/src/stored/bscan.c b/bacula/src/stored/bscan.c index e0610f972..6f35eed13 100644 --- a/bacula/src/stored/bscan.c +++ b/bacula/src/stored/bscan.c @@ -671,6 +671,9 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) */ if (update_db) { DCR *mdcr; + /* Temporary list needed for freeing dcr's outsisde of foreach_dlist loop */ + alist dcrs_to_delete(10, false); + foreach_dlist(mdcr, dev->attached_dcrs) { JCR *mjcr = mdcr->jcr; if (!mjcr || mjcr->JobId == 0) { @@ -689,8 +692,14 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec) Pmsg1(0, _("Could not update job record. ERR=%s\n"), db_strerror(db)); } mjcr->read_dcr = NULL; + dcrs_to_delete.append(mdcr); free_jcr(mjcr); } + + /* Now free dcr's if needed */ + foreach_alist(mdcr, &dcrs_to_delete) { + free_dcr(mdcr); + } } mr.VolFiles = (uint32_t)(rec->Addr >> 32); mr.VolBlocks = (uint32_t)rec->Addr; @@ -987,10 +996,7 @@ static void bscan_free_jcr(JCR *jcr) if (jcr->RestoreBootstrap) { bfree_and_null(jcr->RestoreBootstrap); } - if (jcr->dcr) { - free_dcr(jcr->dcr); - jcr->dcr = NULL; - } + if (jcr->read_dcr) { free_dcr(jcr->read_dcr); jcr->read_dcr = NULL;