]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
Fix #6940 about bscan segfaulting
authorMichal Rakowski <michal.rakowski@baculasystems.com>
Thu, 12 Nov 2020 09:11:38 +0000 (10:11 +0100)
committerEric Bollengier <eric@baculasystems.com>
Thu, 24 Mar 2022 08:02:59 +0000 (09:02 +0100)
Needed to move free_dcr() outside of bscan_free_jcr() callback because
some jcr's were deleted during traversing of dcr's list.

bacula/src/stored/bscan.c

index e0610f972890d863f46e5b30bd9620d24ac1ecc6..6f35eed1365636f692824e8eb2810b4dd2c11ebb 100644 (file)
@@ -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;