Avoid possible stack overflow in ModificationStatement::getFunctions Patch by Alex Petrov; reviewed by Sam Tunnicliffe for CASSANDRA-11621
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/32447745 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/32447745 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/32447745 Branch: refs/heads/trunk Commit: 3244774572c56400ed96da4d57912779878c16e5 Parents: b80ff54 Author: Alex Petrov <oleksandr.pet...@gmail.com> Authored: Thu Apr 21 11:46:09 2016 +0200 Committer: Sam Tunnicliffe <s...@beobal.com> Committed: Thu Apr 21 18:41:43 2016 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cql3/statements/ModificationStatement.java | 13 ++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/32447745/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index e51e6d2..d16f6f6 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.2.7 + * Avoid calling Iterables::concat in loops during ModificationStatement::getFunctions (CASSANDRA-11621) * cqlsh: COPY FROM should use regular inserts for single statement batches and report errors correctly if workers processes crash on initialization (CASSANDRA-11474) * Always close cluster with connection in CqlRecordWriter (CASSANDRA-11553) http://git-wip-us.apache.org/repos/asf/cassandra/blob/32447745/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java index fbdfc0c..059d113 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -99,24 +99,23 @@ public abstract class ModificationStatement implements CQLStatement public Iterable<Function> getFunctions() { - Iterable<Function> functions = attrs.getFunctions(); - + List<Iterable<Function>> iterables = new LinkedList<>(); for (Restriction restriction : processedKeys.values()) - functions = Iterables.concat(functions, restriction.getFunctions()); + iterables.add(restriction.getFunctions()); if (columnOperations != null) for (Operation operation : columnOperations) - functions = Iterables.concat(functions, operation.getFunctions()); + iterables.add(operation.getFunctions()); if (columnConditions != null) for (ColumnCondition condition : columnConditions) - functions = Iterables.concat(functions, condition.getFunctions()); + iterables.add(condition.getFunctions()); if (staticConditions != null) for (ColumnCondition condition : staticConditions) - functions = Iterables.concat(functions, condition.getFunctions()); + iterables.add(condition.getFunctions()); - return functions; + return Iterables.concat(iterables); } public abstract boolean requireFullClusteringKey();