Browse Source

[2850] Handle current_filename_ assignment causing an exception

Mukund Sivaraman 12 years ago
parent
commit
e6d1be1a67

+ 13 - 8
src/lib/datasrc/memory/zone_table_segment_mapped.cc

@@ -153,7 +153,7 @@ ZoneTableSegmentMapped::processHeader(MemorySegmentMapped& segment,
     return (true);
 }
 
-void
+MemorySegmentMapped*
 ZoneTableSegmentMapped::openReadWrite(const std::string& filename,
                                       bool create)
 {
@@ -179,10 +179,10 @@ ZoneTableSegmentMapped::openReadWrite(const std::string& filename,
          }
     }
 
-    mem_sgmt_.reset(segment.release());
+    return (segment.release());
 }
 
-void
+MemorySegmentMapped*
 ZoneTableSegmentMapped::openReadOnly(const std::string& filename) {
     // In case the checksum or table header is missing, we throw. We
     // want the segment to be automatically destroyed then.
@@ -229,7 +229,7 @@ ZoneTableSegmentMapped::openReadOnly(const std::string& filename) {
          }
     }
 
-    mem_sgmt_.reset(segment.release());
+    return (segment.release());
 }
 
 void
@@ -263,21 +263,26 @@ ZoneTableSegmentMapped::reset(MemorySegmentOpenMode mode,
         sync();
     }
 
+    // In case current_filename_ below fails, we want the segment to be
+    // automatically destroyed.
+    std::auto_ptr<MemorySegmentMapped> segment;
+
     switch (mode) {
     case CREATE:
-        openReadWrite(filename, true);
+        segment.reset(openReadWrite(filename, true));
         break;
 
     case READ_WRITE:
-        openReadWrite(filename, false);
+        segment.reset(openReadWrite(filename, false));
         break;
 
     case READ_ONLY:
-        openReadOnly(filename);
+        segment.reset(openReadOnly(filename));
     }
 
-    current_mode_ = mode;
     current_filename_ = filename;
+    current_mode_ = mode;
+    mem_sgmt_.reset(segment.release());
 }
 
 void

+ 3 - 2
src/lib/datasrc/memory/zone_table_segment_mapped.h

@@ -115,8 +115,9 @@ private:
     bool processHeader(isc::util::MemorySegmentMapped& segment, bool create,
                        std::string& error_msg);
 
-    void openReadWrite(const std::string& filename, bool create);
-    void openReadOnly(const std::string& filename);
+    isc::util::MemorySegmentMapped* openReadWrite(const std::string& filename,
+                                                  bool create);
+    isc::util::MemorySegmentMapped* openReadOnly(const std::string& filename);
 
     template<typename T> T* getHeaderHelper() const;