Skip to content

Commit 35b4c43

Browse files
committed
Fix Gson's JsonArray.add models
When the type of the argument isn't JsonElement, the summary must be taint flow instead of value flow
1 parent 6ba7f9a commit 35b4c43

File tree

2 files changed

+18
-13
lines changed

2 files changed

+18
-13
lines changed

java/ql/lib/ext/com.google.gson.model.yml

+6-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ extensions:
2626
- ["com.google.gson", "JsonElement", True, "getAsJsonPrimitive", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
2727
- ["com.google.gson", "JsonElement", True, "getAsString", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
2828
- ["com.google.gson", "JsonElement", True, "toString", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"]
29-
- ["com.google.gson", "JsonArray", True, "add", "", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
29+
- ["com.google.gson", "JsonArray", True, "add", "(Boolean)", "", "Argument[0]", "Argument[this].Element", "taint", "manual"]
30+
- ["com.google.gson", "JsonArray", True, "add", "(Character)", "", "Argument[0]", "Argument[this].Element", "taint", "manual"]
31+
- ["com.google.gson", "JsonArray", True, "add", "(JsonElement)", "", "Argument[0]", "Argument[this].Element", "value", "manual"]
32+
- ["com.google.gson", "JsonArray", True, "add", "(Number)", "", "Argument[0]", "Argument[this].Element", "taint", "manual"]
33+
- ["com.google.gson", "JsonArray", True, "add", "(String)", "", "Argument[0]", "Argument[this].Element", "taint", "manual"]
34+
- ["com.google.gson", "JsonArray", True, "add", "(JsonArray)", "", "Argument[0].Element", "Argument[this].Element", "value", "manual"]
3035
- ["com.google.gson", "JsonArray", True, "asList", "", "", "Argument[this].Element", "ReturnValue.Element", "value", "manual"]
3136
- ["com.google.gson", "JsonArray", True, "get", "", "", "Argument[this].Element", "ReturnValue", "value", "manual"]
3237
- ["com.google.gson", "JsonArray", True, "set", "", "", "Argument[1]", "Argument[this].Element", "value", "manual"]

java/ql/test/library-tests/frameworks/gson/Test.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class Test {
2525
<K> K getMapKeyDefault(Map.Entry<K,?> container) { return container.getKey(); }
2626
JsonElement getMapValueDefault(JsonObject container) { return container.get(null); }
2727
<V> V getMapValueDefault(Map.Entry<?,V> container) { return container.getValue(); }
28-
JsonArray newWithElementDefault(String element) { JsonArray a = new JsonArray(); a.add(element); return a; }
28+
JsonArray newWithElementDefault(JsonElement element) { JsonArray a = new JsonArray(); a.add(element); return a; }
2929
JsonObject newWithMapKeyDefault(String key) { JsonObject o = new JsonObject(); o.add(key, (JsonElement) null); return o; }
3030
JsonObject newWithMapValueDefault(JsonElement element) { JsonObject o = new JsonObject(); o.add(null, element); return o; }
3131
Object source() { return null; }
@@ -232,51 +232,51 @@ public void test() throws Exception {
232232
sink(out); // $ hasTaintFlow
233233
}
234234
{
235-
// "com.google.gson;JsonArray;true;add;;;Argument[0];Argument[this].Element;value;manual"
235+
// "com.google.gson;JsonArray;true;add;(Boolean);;Argument[0];Argument[this].Element;taint;manual"
236236
JsonArray out = null;
237237
Boolean in = (Boolean)source();
238238
out.add(in);
239-
sink(getElement(out)); // $ hasValueFlow
239+
sink(getElement(out)); // $ hasTaintFlow
240240
}
241241
{
242-
// "com.google.gson;JsonArray;true;add;;;Argument[0];Argument[this].Element;value;manual"
242+
// "com.google.gson;JsonArray;true;add;(Character);;Argument[0];Argument[this].Element;taint;manual"
243243
JsonArray out = null;
244244
Character in = (Character)source();
245245
out.add(in);
246-
sink(getElement(out)); // $ hasValueFlow
246+
sink(getElement(out)); // $ hasTaintFlow
247247
}
248248
{
249-
// "com.google.gson;JsonArray;true;add;;;Argument[0];Argument[this].Element;value;manual"
249+
// "com.google.gson;JsonArray;true;add;(JsonElement);;Argument[0];Argument[this].Element;value;manual"
250250
JsonArray out = null;
251251
JsonElement in = (JsonElement)source();
252252
out.add(in);
253253
sink(getElement(out)); // $ hasValueFlow
254254
}
255255
{
256-
// "com.google.gson;JsonArray;true;add;;;Argument[0];Argument[this].Element;value;manual"
256+
// "com.google.gson;JsonArray;true;add;(Number);;Argument[0];Argument[this].Element;taint;manual"
257257
JsonArray out = null;
258258
Number in = (Number)source();
259259
out.add(in);
260-
sink(getElement(out)); // $ hasValueFlow
260+
sink(getElement(out)); // $ hasTaintFlow
261261
}
262262
{
263-
// "com.google.gson;JsonArray;true;add;;;Argument[0];Argument[this].Element;value;manual"
263+
// "com.google.gson;JsonArray;true;add;(JsonArray);;Argument[0].Element;Argument[this].Element;value;manual"
264264
JsonArray out = null;
265-
String in = (String)source();
265+
JsonElement in = (JsonElement)source();
266266
out.add(in);
267267
sink(getElement(out)); // $ hasValueFlow
268268
}
269269
{
270270
// "com.google.gson;JsonArray;true;asList;;;Argument[this].Element;ReturnValue.Element;value;manual"
271271
List out = null;
272-
JsonArray in = (JsonArray)newWithElementDefault((String) source());
272+
JsonArray in = (JsonArray)newWithElementDefault((JsonElement) source());
273273
out = in.asList();
274274
sink(getElement(out)); // $ hasValueFlow
275275
}
276276
{
277277
// "com.google.gson;JsonArray;true;get;;;Argument[this].Element;ReturnValue;value;manual"
278278
JsonElement out = null;
279-
JsonArray in = (JsonArray)newWithElementDefault((String) source());
279+
JsonArray in = (JsonArray)newWithElementDefault((JsonElement) source());
280280
out = in.get(0);
281281
sink(out); // $ hasValueFlow
282282
}

0 commit comments

Comments
 (0)