Browse Source

fixed an off-by-one (too strict) bug, and added a corresponding test case

git-svn-id: svn://bind10.isc.org/svn/bind10/trunk@1070 e5f2f494-b856-4b98-b285-d166d9295462
JINMEI Tatuya 15 years ago
parent
commit
d1df5219e7
2 changed files with 10 additions and 2 deletions
  1. 1 1
      src/lib/dns/cpp/buffer.h
  2. 9 1
      src/lib/dns/cpp/tests/buffer_unittest.cc

+ 1 - 1
src/lib/dns/cpp/buffer.h

@@ -358,7 +358,7 @@ public:
     /// \param pos The beginning position in the buffer to write the data.
     void writeUint16At(uint16_t data, size_t pos)
     {
-        if (pos + sizeof(data) >= data_.size()) {
+        if (pos + sizeof(data) > data_.size()) {
             dns_throw(InvalidBufferPosition, "write at invalid position");
         }
 

+ 9 - 1
src/lib/dns/cpp/tests/buffer_unittest.cc

@@ -126,13 +126,21 @@ TEST_F(BufferTest, outputBufferWriteat)
 {
     obuffer.writeUint32(data32);
     expected_size += sizeof(data32);
+
+    // overwrite 2nd and 3rd bytes
     obuffer.writeUint16At(data16, 1);
     EXPECT_EQ(expected_size, obuffer.getLength()); // length shouldn't change
-
     const uint8_t* cp = static_cast<const uint8_t*>(obuffer.getData());
     EXPECT_EQ(2, *(cp + 1));
     EXPECT_EQ(3, *(cp + 2));
 
+    // overwrite 3rd and 4th bytes
+    obuffer.writeUint16At(data16, 2);
+    EXPECT_EQ(expected_size, obuffer.getLength());
+    cp = static_cast<const uint8_t*>(obuffer.getData());
+    EXPECT_EQ(2, *(cp + 2));
+    EXPECT_EQ(3, *(cp + 3));
+
     EXPECT_THROW(obuffer.writeUint16At(data16, 3),
                  isc::dns::InvalidBufferPosition);
     EXPECT_THROW(obuffer.writeUint16At(data16, 4),