]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[1603] updated the behavior of setCompressMode(): now disallow it in rendering.
authorJINMEI Tatuya <jinmei@isc.org>
Tue, 6 Mar 2012 22:55:56 +0000 (14:55 -0800)
committerJINMEI Tatuya <jinmei@isc.org>
Tue, 6 Mar 2012 22:55:56 +0000 (14:55 -0800)
the new implementation doesn't allow such flexibility anymore (as the
hash value would change).  added comment about that, and updated the test
accordingly.

src/lib/dns/messagerenderer.cc
src/lib/dns/messagerenderer.h
src/lib/dns/tests/messagerenderer_unittest.cc

index 1019d96baf997c7606777db1739a5fb63ed01549..33196c07b9b2e5a305cac1f8230a6d4793dbe4f3 100644 (file)
@@ -184,6 +184,10 @@ MessageRenderer::getCompressMode() const {
 
 void
 MessageRenderer::setCompressMode(const CompressMode mode) {
+    if (!impl_->names_.empty()) {
+        isc_throw(isc::InvalidParameter,
+                  "compress mode cannot be changed during rendering");
+    }
     impl_->compress_mode_ = mode;
 }
 
index f7f2381dc0f18b571781e29e33f885fe60048223..4c1c92a34f8183fd9aed7f19d77cd01c52200331 100644 (file)
@@ -359,7 +359,17 @@ public:
     virtual CompressMode getCompressMode() const;
     virtual void setTruncated();
     virtual void setLengthLimit(size_t len);
+
+    /// This implementation does not allow this call in the middle of
+    /// rendering (i.e. after at least one name is rendered) due to
+    /// restriction specific to the internal implementation.  Such attempts
+    /// will result in an \c isc::InvalidParameter exception.
+    ///
+    /// This shouldn't be too restrictive in practice; there's no known
+    /// practical case for such a mixed compression policy in a single
+    /// message.
     virtual void setCompressMode(CompressMode mode);
+
     virtual void clear();
     virtual void writeName(const Name& name, bool compress = true);
 private:
index 2a1869f2090dc49677d3a24ca784bfac526832f5..04082f1033977279c22c473b68387470f6a1ad97 100644 (file)
@@ -142,13 +142,15 @@ TEST_F(MessageRendererTest, writeNameMixedCaseCompress) {
     renderer.writeName(Name("a.example.com."));
     renderer.writeName(Name("b.eXample.com."));
 
-    // Change the compression mode in the middle of rendering.  This is an
-    // unusual operation and is unlikely to happen in practice, but is still
-    // allowed in this API.
-    renderer.setCompressMode(MessageRenderer::CASE_INSENSITIVE);
-    renderer.writeName(Name("c.b.EXAMPLE.com."));
-    EXPECT_PRED_FORMAT4(UnitTestUtil::matchWireData, renderer.getData(),
-                        renderer.getLength(), &data[0], data.size());
+    // Change the compression mode in the middle of rendering.  This is not
+    // allowed in this implementation.
+    EXPECT_THROW(renderer.setCompressMode(MessageRenderer::CASE_INSENSITIVE),
+                 isc::InvalidParameter);
+
+    // Once the renderer is cleared, it's okay again.
+    renderer.clear();
+    EXPECT_NO_THROW(renderer.setCompressMode(
+                        MessageRenderer::CASE_INSENSITIVE));
 }
 
 TEST_F(MessageRendererTest, writeRootName) {