BIND 10 trac2572-fix, updated. f45c804082f5ebfbe3339224083531fe86f2bfb2 [2572] convert OpenError to Unexpected in the stream ver. of pushSource.

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Jan 15 03:16:40 UTC 2013


The branch, trac2572-fix has been updated
       via  f45c804082f5ebfbe3339224083531fe86f2bfb2 (commit)
      from  5eeb4b30cbea6d0f5588cf0ad542cdccd49510c1 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit f45c804082f5ebfbe3339224083531fe86f2bfb2
Author: JINMEI Tatuya <jinmei at isc.org>
Date:   Mon Jan 14 19:15:15 2013 -0800

    [2572] convert OpenError to Unexpected in the stream ver. of pushSource.
    
    with the change for #2572 this version can now have this exception, and
    since it's intended to be hidden within the lexer and input source classes,
    we need to convert it.  doc/tests are also added/updated.

-----------------------------------------------------------------------

Summary of changes:
 src/lib/dns/master_lexer.cc                |    8 +++++++-
 src/lib/dns/master_lexer.h                 |   16 ++++++++++++++++
 src/lib/dns/tests/master_lexer_unittest.cc |    9 +++++++++
 3 files changed, 32 insertions(+), 1 deletion(-)

-----------------------------------------------------------------------
diff --git a/src/lib/dns/master_lexer.cc b/src/lib/dns/master_lexer.cc
index 518bea3..7febd58 100644
--- a/src/lib/dns/master_lexer.cc
+++ b/src/lib/dns/master_lexer.cc
@@ -144,7 +144,13 @@ MasterLexer::pushSource(const char* filename, std::string* error) {
 
 void
 MasterLexer::pushSource(std::istream& input) {
-    impl_->sources_.push_back(InputSourcePtr(new InputSource(input)));
+    try {
+        impl_->sources_.push_back(InputSourcePtr(new InputSource(input)));
+    } catch (const InputSource::OpenError& ex) {
+        // Convert the "internal" exception to public one.
+        isc_throw(Unexpected, "Failed to push a stream to lexer: " <<
+                  ex.what());
+    }
     impl_->source_ = impl_->sources_.back().get();
     impl_->has_previous_ = false;
     impl_->last_was_eol_ = true;
diff --git a/src/lib/dns/master_lexer.h b/src/lib/dns/master_lexer.h
index 9363ff5..d14febe 100644
--- a/src/lib/dns/master_lexer.h
+++ b/src/lib/dns/master_lexer.h
@@ -401,6 +401,22 @@ public:
     /// The behavior of the lexer is undefined if the caller builds or adds
     /// data in \c input after pushing it.
     ///
+    /// Except for rare case system errors such as memory allocation failure,
+    /// this method is generally expected to be exception free.  However,
+    /// it can still throw if it encounters an unexpected failure when it
+    /// tries to identify the "size" of the input source (see
+    /// \c getTotalSourceSize()).  It's an unexpected result unless the
+    /// caller intentionally passes a broken stream; otherwise it would mean
+    /// some system-dependent unexpected behavior or possibly an internal bug.
+    /// In these cases it throws an \c Unexpected exception.  Note that
+    /// this version of the method doesn't return a boolean unlike the
+    /// other version that takes a file name; since this failure is really
+    /// unexpected and can be critical, it doesn't make sense to give the
+    /// caller an option to continue (other than by explicitly catching the
+    /// exception).
+    ///
+    /// \throw Unexpected An unexpected failure happens in initialization.
+    ///
     /// \param input An input stream object that produces textual
     /// representation of DNS RRs.
     void pushSource(std::istream& input);
diff --git a/src/lib/dns/tests/master_lexer_unittest.cc b/src/lib/dns/tests/master_lexer_unittest.cc
index c8ab61f..aececa7 100644
--- a/src/lib/dns/tests/master_lexer_unittest.cc
+++ b/src/lib/dns/tests/master_lexer_unittest.cc
@@ -80,6 +80,15 @@ TEST_F(MasterLexerTest, pushStream) {
     checkEmptySource(lexer);
 }
 
+TEST_F(MasterLexerTest, pushStreamFail) {
+    // Pretend a "bad" thing happened in the stream.  This will make the
+    // initialization throw an exception.
+    ss << "test";
+    ss.setstate(std::ios_base::badbit);
+
+    EXPECT_THROW(lexer.pushSource(ss), isc::Unexpected);
+}
+
 TEST_F(MasterLexerTest, pushFile) {
     // We use zone file (-like) data, but in this test that actually doesn't
     // matter.



More information about the bind10-changes mailing list