You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2018/11/29 14:54:48 UTC

[5/9] cassandra git commit: Throw exception if Columns serialized subset encode more columns than possible

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/trunk
Commit: 7bdea449c320c8a47a4e253e5cf6aa854d7a968d
Parents: 4b1f40d
Author: Benedict Elliott Smith <be...@apple.com>
Authored: Fri Jul 27 16:17:30 2018 +0100
Committer: Benedict Elliott Smith <be...@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-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org