You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/02/09 18:07:23 UTC

svn commit: r1068978 - in /cassandra/branches/cassandra-0.6: CHANGES.txt src/java/org/apache/cassandra/db/commitlog/CommitLog.java

Author: jbellis
Date: Wed Feb  9 17:07:23 2011
New Revision: 1068978

URL: http://svn.apache.org/viewvc?rev=1068978&view=rev
Log:
update commitlog replay to catch bogus RowMutation lengths
patch by jbellis; reviewed by gdusbabek for CASSANDRA-2128

Modified:
    cassandra/branches/cassandra-0.6/CHANGES.txt
    cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java

Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=1068978&r1=1068977&r2=1068978&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Wed Feb  9 17:07:23 2011
@@ -1,6 +1,8 @@
 0.6.12
  * include digest responses in dynamic snitch latencies (CASSANDRA-2085)
  * fix range slice ConsistencyLevel > ONE (CASSANDRA-2081)
+ * update commitlog replay to catch bogus RowMutation lengths caused
+   by unclean shutdown (CASSANDRA-2128)
 
 
 0.6.11

Modified: cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java
URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java?rev=1068978&r1=1068977&r2=1068978&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java (original)
+++ cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/commitlog/CommitLog.java Wed Feb  9 17:07:23 2011
@@ -216,7 +216,13 @@ public class CommitLog
                     byte[] bytes;
                     try
                     {
-                        bytes = new byte[(int) reader.readLong()]; // readlong can throw EOFException too
+                        long length = reader.readLong();
+                        // RowMutation must be at LEAST 10 bytes:
+                        // 3 each for a non-empty Table and Key (including the 2-byte length from writeUTF), 4 bytes for column count.
+                        // This prevents CRC by being fooled by special-case garbage in the file; see CASSANDRA-2128
+                        if (length < 10 || length > Integer.MAX_VALUE)
+                            break;
+                        bytes = new byte[(int) length]; // readlong can throw EOFException too
                         reader.readFully(bytes);
                         claimedCRC32 = reader.readLong();
                     }