You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kafka.apache.org by rh...@apache.org on 2020/10/12 18:22:26 UTC

[kafka] branch 2.4 updated: KAFKA-10574: Fix infinite loop in Values::parseString (#9375)

This is an automated email from the ASF dual-hosted git repository.

rhauch pushed a commit to branch 2.4
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/2.4 by this push:
     new c0f6603  KAFKA-10574: Fix infinite loop in Values::parseString (#9375)
c0f6603 is described below

commit c0f66031d3b8a704adea2ecde9c893b1f114a57b
Author: Chris Egerton <ch...@confluent.io>
AuthorDate: Mon Oct 12 12:42:42 2020 -0400

    KAFKA-10574: Fix infinite loop in Values::parseString (#9375)
    
    Fix infinite loop in Values::parseString
    
    Author: Chris Egerton <ch...@confluent.io>
    Reviewers: Konstantine Karantasis <ko...@confluent.io>, Randall Hauch <rh...@gmail.com>
---
 .../src/main/java/org/apache/kafka/connect/data/Values.java |  2 +-
 .../test/java/org/apache/kafka/connect/data/ValuesTest.java | 13 +++++++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/connect/api/src/main/java/org/apache/kafka/connect/data/Values.java b/connect/api/src/main/java/org/apache/kafka/connect/data/Values.java
index 2c0d6ba..2e30a7e 100644
--- a/connect/api/src/main/java/org/apache/kafka/connect/data/Values.java
+++ b/connect/api/src/main/java/org/apache/kafka/connect/data/Values.java
@@ -1193,7 +1193,7 @@ public class Values {
             boolean escaped = false;
             int start = iter.getIndex();
             char c = iter.current();
-            while (c != CharacterIterator.DONE) {
+            while (canConsumeNextToken()) {
                 switch (c) {
                     case '\\':
                         escaped = !escaped;
diff --git a/connect/api/src/test/java/org/apache/kafka/connect/data/ValuesTest.java b/connect/api/src/test/java/org/apache/kafka/connect/data/ValuesTest.java
index 63c05ea..cb6f71a 100644
--- a/connect/api/src/test/java/org/apache/kafka/connect/data/ValuesTest.java
+++ b/connect/api/src/test/java/org/apache/kafka/connect/data/ValuesTest.java
@@ -23,6 +23,7 @@ import org.junit.Test;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -75,6 +76,18 @@ public class ValuesTest {
         INT_LIST.add(-987654321);
     }
 
+    @Test(timeout = 5000)
+    public void shouldNotEncounterInfiniteLoop() {
+        // This byte sequence gets parsed as CharacterIterator.DONE and can cause issues if
+        // comparisons to that character are done to check if the end of a string has been reached.
+        // For more information, see https://issues.apache.org/jira/browse/KAFKA-10574
+        byte[] bytes = new byte[] {-17, -65,  -65};
+        String str = new String(bytes, StandardCharsets.UTF_8);
+        SchemaAndValue schemaAndValue = Values.parseString(str);
+        assertEquals(Type.STRING, schemaAndValue.schema().type());
+        assertEquals(str, schemaAndValue.value());
+    }
+
     @Test
     public void shouldNotParseUnquotedEmbeddedMapKeysAsStrings() {
         SchemaAndValue schemaAndValue = Values.parseString("{foo: 3}");