From: Michal 'vorner' Vaner Date: Sat, 13 Oct 2012 09:48:18 +0000 (+0200) Subject: [2207] Check the load action returns something X-Git-Tag: trac2402_base~12^2~27 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=70aa7bfa24600d5492056c860838d94c9243c6aa;p=thirdparty%2Fkea.git [2207] Check the load action returns something NULL makes no sense, so throw in that case. --- diff --git a/src/lib/datasrc/memory/zone_reloader.cc b/src/lib/datasrc/memory/zone_reloader.cc index 1e1052e68f..3027a70f8c 100644 --- a/src/lib/datasrc/memory/zone_reloader.cc +++ b/src/lib/datasrc/memory/zone_reloader.cc @@ -52,6 +52,11 @@ ZoneReloaderLocal::load() { zone_data_ = load_action_(segment_->getMemorySegment()); + if (zone_data_ == NULL) { + // Bug inside load_action_. + isc_throw(isc::Unexpected, "No data returned from load action"); + } + data_ready_ = true; } diff --git a/src/lib/datasrc/memory/zone_reloader.h b/src/lib/datasrc/memory/zone_reloader.h index e7097278c2..904b603b44 100644 --- a/src/lib/datasrc/memory/zone_reloader.h +++ b/src/lib/datasrc/memory/zone_reloader.h @@ -108,6 +108,8 @@ class ZoneSegmentID {}; /// This callback should create new ZoneData (allocated from the passed /// memory segment) and fill it with relevant loaded data. The caller /// of the callback takes ownership of the ZoneData. +/// +/// It must not return NULL. typedef boost::function LoadAction; /// \brief Install the zone somewhere. /// diff --git a/src/lib/datasrc/tests/memory/zone_reloader_unittest.cc b/src/lib/datasrc/tests/memory/zone_reloader_unittest.cc index aebdc0ee3e..ba9d5c22e4 100644 --- a/src/lib/datasrc/tests/memory/zone_reloader_unittest.cc +++ b/src/lib/datasrc/tests/memory/zone_reloader_unittest.cc @@ -52,7 +52,8 @@ public: load_called_(false), install_called_(false), load_throw_(false), - install_throw_(false) + install_throw_(false), + load_null_(false) {} void TearDown() { // Release the reloader @@ -67,6 +68,7 @@ protected: bool install_called_; bool load_throw_; bool install_throw_; + bool load_null_; private: ZoneData* loadAction(isc::util::MemorySegment& segment) { // Make sure it is the correct segment passed. We know the @@ -78,6 +80,10 @@ private: throw TestException(); } + if (load_null_) { + // Be nasty to the caller and return NULL, which is forbidden + return (NULL); + } // Create a new zone data. It may be empty for our tests, nothing // goes inside. return (ZoneData::create(segment, Name("example.org"))); @@ -239,4 +245,16 @@ TEST_F(ZoneReloaderLocalTest, installThrows) { EXPECT_NO_THROW(reloader_->cleanup()); } +// Check the reloader defends itsefl when load action returns NULL +TEST_F(ZoneReloaderLocalTest, loadNull) { + load_null_ = true; + EXPECT_THROW(reloader_->load(), isc::Unexpected); + + // We can't install that + EXPECT_THROW(reloader_->install(), isc::Unexpected); + + // It should be possible to clean up safely + EXPECT_NO_THROW(reloader_->cleanup()); +} + }