]> git.sur5r.net Git - bacula/bacula/commitdiff
kes Fix bug #1047, which had a heap overrun when stripping certain paths,
authorKern Sibbald <kern@sibbald.com>
Sun, 10 Feb 2008 18:24:21 +0000 (18:24 +0000)
committerKern Sibbald <kern@sibbald.com>
Sun, 10 Feb 2008 18:24:21 +0000 (18:24 +0000)
     and do not strip paths on symbolic links.

git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6396 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/src/stored/bscan.c
bacula/src/stored/dev.h
bacula/src/stored/device.c
bacula/src/stored/label.c
bacula/src/stored/mac.c
bacula/src/stored/protos.h

index 2bdeac3f0480228d5734b3b6cfbdeca7ffddb641..0127b181c508bc0ccf27714fa722dc5aef8788fe 100644 (file)
@@ -523,20 +523,6 @@ static bool record_cb(DCR *dcr, DEV_RECORD *rec)
          update_db = save_update_db;
 
          jr.PoolId = pr.PoolId;
-#ifdef xxx
-         /* Set start positions into JCR */
-         if (dev->is_tape()) {
-            /*
-             * Note, we have already advanced past current block,
-             *  so the correct number is block_num - 1
-             */
-            dcr->StartBlock = dev->block_num - 1;
-            dcr->StartFile = dev->file;
-         } else {
-            dcr->StartBlock = (uint32_t)dev->file_addr;
-            dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
-         }
-#endif
          mjcr->start_time = jr.StartTime;
          mjcr->JobLevel = jr.JobLevel;
 
index d2a2243ebbfcf5bcc87cfce6d875ea0c696daf87..b5ea0c63ef7eb050d090e71599165bcbe72521dd 100644 (file)
@@ -1,7 +1,7 @@
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2000-2007 Free Software Foundation Europe e.V.
+   Copyright (C) 2000-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
@@ -463,7 +463,7 @@ public:
    /* Methods */
    bool is_dev_locked() { return m_dev_locked; }
    void dlock() { dev->dlock(); m_dev_locked = true; }
-   void dunlock() { dev->dunlock(); m_dev_locked = false;}
+   void dunlock() { m_dev_locked = false; dev->dunlock(); }
    void dblock(int why) { dev->dblock(why); }
 
 };
index 3aeaf86927f9fdd85084cba7e9fa0259248cf5e2..b38b512d0bba87783189ab5d40f589c78febd802 100644 (file)
@@ -200,6 +200,19 @@ bail_out:
    return ok;                               /* device locked */
 }
 
+void set_start_vol_position(DCR *dcr)
+{
+   DEVICE *dev = dcr->dev;
+   /* Set new start position */
+   if (dev->is_tape()) {
+      dcr->StartBlock = dev->block_num;
+      dcr->StartFile = dev->file;
+   } else {
+      dcr->StartBlock = (uint32_t)dev->file_addr;
+      dcr->StartFile  = (uint32_t)(dev->file_addr >> 32);
+   }
+}
+
 /*
  * We have a new Volume mounted, so reset the Volume parameters
  *  concerning this job.  The global changes were made earlier
@@ -208,24 +221,11 @@ bail_out:
 void set_new_volume_parameters(DCR *dcr)
 {
    JCR *jcr = dcr->jcr;
-   DEVICE *dev = dcr->dev;
    if (dcr->NewVol && !dir_get_volume_info(dcr, GET_VOL_INFO_FOR_WRITE)) {
       Jmsg1(jcr, M_ERROR, 0, "%s", jcr->errmsg);
    }
-   /* Set new start/end positions */
-   if (dev->is_tape()) {
-      dcr->StartBlock = dev->block_num;
-      dcr->StartFile = dev->file;
-   } else {
-      dcr->StartBlock = (uint32_t)dev->file_addr;
-      dcr->StartFile  = (uint32_t)(dev->file_addr >> 32);
-   }
-   /* Reset indicies */
-   dcr->VolFirstIndex = 0;
-   dcr->VolLastIndex = 0;
+   set_new_file_parameters(dcr);
    jcr->NumWriteVolumes++;
-   dcr->NewVol = false;
-   dcr->WroteVol = false;
 }
 
 /*
@@ -235,16 +235,8 @@ void set_new_volume_parameters(DCR *dcr)
  */
 void set_new_file_parameters(DCR *dcr)
 {
-   DEVICE *dev = dcr->dev;
+   set_start_vol_position(dcr);
 
-   /* Set new start/end positions */
-   if (dev->is_tape()) {
-      dcr->StartBlock = dev->block_num;
-      dcr->StartFile = dev->file;
-   } else {
-      dcr->StartBlock = (uint32_t)dev->file_addr;
-      dcr->StartFile  = (uint32_t)(dev->file_addr >> 32);
-   }
    /* Reset indicies */
    dcr->VolFirstIndex = 0;
    dcr->VolLastIndex = 0;
index d27dd7ea00fa5725be49977403f543f3f31f7f33..115f7ae0d1e1f53f82979e9e154f24f1a3784135 100644 (file)
@@ -703,13 +703,7 @@ bool write_session_label(DCR *dcr, int label)
    Dmsg1(130, "session_label record=%x\n", rec);
    switch (label) {
    case SOS_LABEL:
-      if (dev->is_tape()) {
-         dcr->StartBlock = dev->block_num;
-         dcr->StartFile  = dev->file;
-      } else {
-         dcr->StartBlock = (uint32_t)dev->file_addr;
-         dcr->StartFile = (uint32_t)(dev->file_addr >> 32);
-      }
+      set_start_vol_position(dcr);
       break;
    case EOS_LABEL:
       if (dev->is_tape()) {
index 11528ad84cbe60ed8da97868dfa0604cdf3807f8..59e4c1ff61967692a8680820376429b91e68a3ec 100644 (file)
@@ -1,15 +1,7 @@
-/*
- * SD -- mac.c --  responsible for doing
- *     migration, archive, and copy jobs.
- *
- *     Kern Sibbald, January MMVI
- *
- *   Version $Id$
- */
 /*
    Bacula® - The Network Backup Solution
 
-   Copyright (C) 2006-2006 Free Software Foundation Europe e.V.
+   Copyright (C) 2006-2008 Free Software Foundation Europe e.V.
 
    The main author of Bacula is Kern Sibbald, with contributions from
    many others, a complete list can be found in the file AUTHORS.
    (FSFE), Fiduciary Program, Sumatrastrasse 25, 8006 Zürich,
    Switzerland, email:ftf@fsfeurope.org.
 */
+/*
+ * SD -- mac.c --  responsible for doing
+ *     migration, archive, and copy jobs.
+ *
+ *     Kern Sibbald, January MMVI
+ *
+ *   Version $Id$
+ */
 
 #include "bacula.h"
 #include "stored.h"
@@ -108,6 +108,7 @@ bool do_mac(JCR *jcr)
 
    jcr->dcr->VolFirstIndex = jcr->dcr->VolLastIndex = 0;
    jcr->run_time = time(NULL);
+   set_start_vol_position(jcr->dcr);
 
    ok = read_records(jcr->read_dcr, record_cb, mount_next_read_volume);
    goto ok_out;
index 5ce0294da3d81bc6f315c7a207a340d50f586524..c25b1f8d81fa75c932d7cec5ecf709cb5a28de4b 100644 (file)
@@ -127,6 +127,7 @@ void    dvd_remove_empty_part(DCR *dcr);
 bool     open_device(DCR *dcr);
 bool     first_open_device(DCR *dcr);
 bool     fixup_device_block_write_error(DCR *dcr);
+void     set_start_vol_position(DCR *dcr);
 void     set_new_volume_parameters(DCR *dcr);
 void     set_new_file_parameters(DCR *dcr);
 bool     is_device_unmounted(DEVICE *dev);