From: Mukund Sivaraman Date: Wed, 8 May 2013 11:32:16 +0000 (+0530) Subject: [2850] Handle current_filename_ assignment causing an exception X-Git-Tag: bind10-1.2.0beta1-release~467^2~29 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e6d1be1a6718874ab37b0f403c3e266c90bcdf87;p=thirdparty%2Fkea.git [2850] Handle current_filename_ assignment causing an exception --- diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.cc b/src/lib/datasrc/memory/zone_table_segment_mapped.cc index 6e0e4156ab..3140f90357 100644 --- a/src/lib/datasrc/memory/zone_table_segment_mapped.cc +++ b/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 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 diff --git a/src/lib/datasrc/memory/zone_table_segment_mapped.h b/src/lib/datasrc/memory/zone_table_segment_mapped.h index c212f7cc2f..2d95dd67e0 100644 --- a/src/lib/datasrc/memory/zone_table_segment_mapped.h +++ b/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 T* getHeaderHelper() const;