Skip to content

Commit d372441

Browse files
committed
Disallow duplicate keys in JsonReader
1 parent b11d6d4 commit d372441

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

log4j-kit/src/main/java/org/apache/logging/log4j/kit/json/JsonReader.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,10 @@ private Map<String, Object> readObject() {
299299
final String message = String.format(
300300
"was expecting an object key at index %d: %s", readTokenStartIndex, readToken);
301301
throw new IllegalArgumentException(message);
302+
} else if (object.containsKey(key)) {
303+
final String message =
304+
String.format("found duplicate object key at index %d: %s", readTokenStartIndex, key);
305+
throw new IllegalArgumentException(message);
302306
}
303307
} else {
304308
expectDelimiter(Delimiter.OBJECT_END, readToken);

log4j-kit/src/test/java/org/apache/logging/log4j/kit/json/JsonReaderTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.assertj.core.api.Assertions;
2626
import org.junit.jupiter.api.Test;
2727
import org.junit.jupiter.params.ParameterizedTest;
28+
import org.junit.jupiter.params.provider.CsvSource;
2829
import org.junit.jupiter.params.provider.ValueSource;
2930

3031
class JsonReaderTest {
@@ -236,6 +237,7 @@ void test_invalid_array_end_3() {
236237
void test_valid_objects() {
237238
test("{}", Collections.emptyMap());
238239
test("{\"foo\":\"bar\"}", Collections.singletonMap("foo", "bar"));
240+
test("{\"x\":{\"x\": \"x\"}}", Collections.singletonMap("x", Collections.singletonMap("x", "x")));
239241
}
240242

241243
@Test
@@ -301,6 +303,21 @@ void test_invalid_object_key() {
301303
.hasMessage("was expecting an object key at index 13: ARRAY_END");
302304
}
303305

306+
@ParameterizedTest
307+
@CsvSource(
308+
value = {
309+
"a|7|{\"a\":1,\"a\":2}",
310+
"a|13|{\"a\":1,\"b\":2,\"a\":3}",
311+
"c|24|{\"a\":1,\"b\":{\"c\":2,\"d\":3,\"c\":4}}"
312+
},
313+
delimiter = '|')
314+
void test_conflicting_object_key_1(final String key, final int index, final String json) {
315+
Assertions.assertThatThrownBy(() -> JsonReader.read(json))
316+
.as("key=`%s`, index=%d, json=`%s`", key, index, json)
317+
.isInstanceOf(IllegalArgumentException.class)
318+
.hasMessage("found duplicate object key at index %d: %s", index, key);
319+
}
320+
304321
@Test
305322
@SuppressWarnings("DoubleBraceInitialization")
306323
public void test_nesting() {

0 commit comments

Comments
 (0)