Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.0 f7630e4c3 -> 7bdea449c
  refs/heads/cassandra-3.11 4a531c27c -> 1084ad9ee
  refs/heads/trunk 9a7db292c -> 2ee9d6854


Throw exception if Columns serialized subset encode more columns than possible

patch by Benedict; reviewed by Dinesh Joshi for CASSANDRA-14591


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/7bdea449
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/7bdea449
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/7bdea449

Branch: refs/heads/cassandra-3.0
Commit: 7bdea449c320c8a47a4e253e5cf6aa854d7a968d
Parents: 4b1f40d
Author: Benedict Elliott Smith <bened...@apple.com>
Authored: Fri Jul 27 16:17:30 2018 +0100
Committer: Benedict Elliott Smith <bened...@apache.org>
Committed: Thu Nov 29 14:29:20 2018 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 src/java/org/apache/cassandra/db/Columns.java   |  2 ++
 .../org/apache/cassandra/db/ColumnsTest.java    | 29 +++++++++++++++++++-
 3 files changed, 31 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/7bdea449/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 060fa9d..9ba36fa 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,7 @@
 3.0.18
  * RangeTombstoneList doesn't properly clean up mergeable or superseded rts in 
some cases (CASSANDRA-14894)
  * Fix handling of collection tombstones for dropped columns from legacy 
sstables (CASSANDRA-14912)
+ * Throw exception if Columns serialized subset encode more columns than 
possible (CASSANDRA-14591)
  * Drop/add column name with different Kind can result in corruption 
(CASSANDRA-14843)
  * Fix missing rows when reading 2.1 SSTables with static columns in 3.0 
(CASSANDRA-14873)
  * Move TWCS message 'No compaction necessary for bucket size' to Trace level 
(CASSANDRA-14884)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7bdea449/src/java/org/apache/cassandra/db/Columns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/Columns.java 
b/src/java/org/apache/cassandra/db/Columns.java
index 45ce91e..18e17d7 100644
--- a/src/java/org/apache/cassandra/db/Columns.java
+++ b/src/java/org/apache/cassandra/db/Columns.java
@@ -526,6 +526,8 @@ public class Columns extends 
AbstractCollection<ColumnDefinition> implements Col
                     }
                     encoded >>>= 1;
                 }
+                if (encoded != 0)
+                    throw new IOException("Invalid Columns subset bytes; too 
many bits set:" + Long.toBinaryString(encoded));
                 return new Columns(builder.build(), firstComplexIdx);
             }
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7bdea449/test/unit/org/apache/cassandra/db/ColumnsTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/db/ColumnsTest.java 
b/test/unit/org/apache/cassandra/db/ColumnsTest.java
index 1a245a0..9498e8b 100644
--- a/test/unit/org/apache/cassandra/db/ColumnsTest.java
+++ b/test/unit/org/apache/cassandra/db/ColumnsTest.java
@@ -27,6 +27,8 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 
+import org.apache.cassandra.cql3.ColumnIdentifier;
+import org.apache.cassandra.db.marshal.BytesType;
 import org.junit.AfterClass;
 import org.junit.Test;
 
@@ -48,6 +50,31 @@ public class ColumnsTest
 
     private static final CFMetaData cfMetaData = MockSchema.newCFS().metadata;
 
+    @Test
+    public void testDeserializeCorruption() throws IOException
+    {
+        ColumnsCheck check = randomSmall(1, 0, 3, 0);
+        Columns superset = check.columns;
+        List<ColumnDefinition> minus1 = new ArrayList<>(check.definitions);
+        minus1.remove(3);
+        Columns minus2 = check.columns
+                .without(check.columns.getSimple(3))
+                .without(check.columns.getSimple(2));
+        try (DataOutputBuffer out = new DataOutputBuffer())
+        {
+            // serialize a subset
+            Columns.serializer.serializeSubset(minus1, superset, out);
+            try (DataInputBuffer in = new DataInputBuffer(out.toByteArray()))
+            {
+                Columns.serializer.deserializeSubset(minus2, in);
+                Assert.assertFalse(true);
+            }
+            catch (IOException e)
+            {
+            }
+        }
+    }
+
     // this tests most of our functionality, since each subset we perform
     // reasonably comprehensive tests of basic functionality against
     @Test
@@ -455,7 +482,7 @@ public class ColumnsTest
             results.add(ColumnDefinition.regularDef(cfMetaData, bytes(name), 
UTF8Type.instance));
     }
 
-    private static <V> void addComplex(List<String> names, 
List<ColumnDefinition> results)
+    private static void addComplex(List<String> names, List<ColumnDefinition> 
results)
     {
         for (String name : names)
             results.add(ColumnDefinition.regularDef(cfMetaData, bytes(name), 
SetType.getInstance(UTF8Type.instance, true)));


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to