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