Skip to content

Commit

Permalink
Protect against deeply nested JSON maps
Browse files Browse the repository at this point in the history
  • Loading branch information
philwebb committed Jul 26, 2022
1 parent 4132414 commit da91cde
Showing 1 changed file with 4 additions and 4 deletions.
Expand Up @@ -42,7 +42,7 @@ public class BasicJsonParser extends AbstractJsonParser {

@Override
public Map<String, Object> parseMap(String json) {
return tryParse(() -> parseMap(json, this::parseMapInternal), Exception.class);
return tryParse(() -> parseMap(json, (jsonToParse) -> parseMapInternal(0, jsonToParse)), Exception.class);
}

@Override
Expand All @@ -67,7 +67,7 @@ private Object parseInternal(int nesting, String json) {
return parseListInternal(nesting + 1, json);
}
if (json.startsWith("{")) {
return parseMapInternal(json);
return parseMapInternal(nesting, json);
}
if (json.startsWith("\"")) {
return trimTrailingCharacter(trimLeadingCharacter(json, '"'), '"');
Expand All @@ -87,15 +87,15 @@ private Object parseInternal(int nesting, String json) {
return json;
}

private Map<String, Object> parseMapInternal(String json) {
private Map<String, Object> parseMapInternal(int nesting, String json) {
Map<String, Object> map = new LinkedHashMap<>();
json = trimLeadingCharacter(trimTrailingCharacter(json, '}'), '{').trim();
for (String pair : tokenize(json)) {
String[] values = StringUtils.trimArrayElements(StringUtils.split(pair, ":"));
Assert.state(values[0].startsWith("\"") && values[0].endsWith("\""),
"Expecting double-quotes around field names");
String key = trimLeadingCharacter(trimTrailingCharacter(values[0], '"'), '"');
Object value = parseInternal(0, values[1]);
Object value = parseInternal(nesting, values[1]);
map.put(key, value);
}
return map;
Expand Down

0 comments on commit da91cde

Please sign in to comment.