Skip to content

Commit 3ae99b9

Browse files
authored
Merge pull request github#6215 from aschackmull/java/fix-csv-subtype-interpretation
Java: Fix CSV subtype interpretation
2 parents f6f7020 + 9388983 commit 3ae99b9

File tree

4 files changed

+26
-18
lines changed

4 files changed

+26
-18
lines changed

java/ql/src/semmle/code/java/dataflow/ExternalFlow.qll

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ private predicate summaryModelCsv(string row) {
274274
"java.io;File;false;toURI;;;Argument[-1];ReturnValue;taint",
275275
"java.io;File;false;toPath;;;Argument[-1];ReturnValue;taint",
276276
"java.nio.file;Path;false;toFile;;;Argument[-1];ReturnValue;taint",
277-
"java.io;Reader;true;readLine;;;Argument[-1];ReturnValue;taint",
277+
"java.io;BufferedReader;true;readLine;;;Argument[-1];ReturnValue;taint",
278278
"java.io;Reader;true;read;();;Argument[-1];ReturnValue;taint",
279279
// arg to return
280280
"java.util;Base64$Encoder;false;encode;(byte[]);;Argument[0];ReturnValue;taint",
@@ -285,8 +285,12 @@ private predicate summaryModelCsv(string row) {
285285
"java.util;Base64$Decoder;false;decode;(ByteBuffer);;Argument[0];ReturnValue;taint",
286286
"java.util;Base64$Decoder;false;decode;(String);;Argument[0];ReturnValue;taint",
287287
"java.util;Base64$Decoder;false;wrap;(InputStream);;Argument[0];ReturnValue;taint",
288-
"org.apache.commons.codec;Encoder;true;encode;;;Argument[0];ReturnValue;taint",
289-
"org.apache.commons.codec;Decoder;true;decode;;;Argument[0];ReturnValue;taint",
288+
"org.apache.commons.codec;Encoder;true;encode;(Object);;Argument[0];ReturnValue;taint",
289+
"org.apache.commons.codec;Decoder;true;decode;(Object);;Argument[0];ReturnValue;taint",
290+
"org.apache.commons.codec;BinaryEncoder;true;encode;(byte[]);;Argument[0];ReturnValue;taint",
291+
"org.apache.commons.codec;BinaryDecoder;true;decode;(byte[]);;Argument[0];ReturnValue;taint",
292+
"org.apache.commons.codec;StringEncoder;true;encode;(String);;Argument[0];ReturnValue;taint",
293+
"org.apache.commons.codec;StringDecoder;true;decode;(String);;Argument[0];ReturnValue;taint",
290294
"org.apache.commons.io;IOUtils;false;buffer;;;Argument[0];ReturnValue;taint",
291295
"org.apache.commons.io;IOUtils;false;readLines;;;Argument[0];ReturnValue;taint",
292296
"org.apache.commons.io;IOUtils;false;readFully;(InputStream,int);;Argument[0];ReturnValue;taint",
@@ -586,14 +590,6 @@ private predicate elementSpec(
586590
summaryModel(namespace, type, subtypes, name, signature, ext, _, _, _)
587591
}
588592

589-
bindingset[namespace, type, subtypes]
590-
private RefType interpretType(string namespace, string type, boolean subtypes) {
591-
exists(RefType t |
592-
t.hasQualifiedName(namespace, type) and
593-
if subtypes = true then result.getASourceSupertype*() = t else result = t
594-
)
595-
}
596-
597593
private string paramsStringPart(Callable c, int i) {
598594
i = -1 and result = "("
599595
or
@@ -614,9 +610,13 @@ private Element interpretElement0(
614610
string namespace, string type, boolean subtypes, string name, string signature
615611
) {
616612
elementSpec(namespace, type, subtypes, name, signature, _) and
617-
exists(RefType t | t = interpretType(namespace, type, subtypes) |
613+
exists(RefType t | t.hasQualifiedName(namespace, type) |
618614
exists(Member m |
619-
result = m and
615+
(
616+
result = m
617+
or
618+
subtypes = true and result.(SrcMethod).overridesOrInstantiates+(m)
619+
) and
620620
m.getDeclaringType() = t and
621621
m.hasName(name)
622622
|
@@ -625,7 +625,7 @@ private Element interpretElement0(
625625
paramsString(m) = signature
626626
)
627627
or
628-
result = t and
628+
(if subtypes = true then result.(SrcRefType).getASourceSupertype*() = t else result = t) and
629629
name = "" and
630630
signature = ""
631631
)

java/ql/src/semmle/code/java/dataflow/internal/ContainerFlow.qll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ private class ContainerFlowSummaries extends SummaryModelCsv {
115115
"java.util;Map;true;get;;;MapValue of Argument[-1];ReturnValue;value",
116116
"java.util;Map;true;getOrDefault;;;MapValue of Argument[-1];ReturnValue;value",
117117
"java.util;Map;true;getOrDefault;;;Argument[1];ReturnValue;value",
118-
"java.util;Map;true;put;;;MapValue of Argument[-1];ReturnValue;value",
119-
"java.util;Map;true;put;;;Argument[0];MapKey of Argument[-1];value",
120-
"java.util;Map;true;put;;;Argument[1];MapValue of Argument[-1];value",
118+
"java.util;Map;true;put;(Object,Object);;MapValue of Argument[-1];ReturnValue;value",
119+
"java.util;Map;true;put;(Object,Object);;Argument[0];MapKey of Argument[-1];value",
120+
"java.util;Map;true;put;(Object,Object);;Argument[1];MapValue of Argument[-1];value",
121121
"java.util;Map;true;putIfAbsent;;;MapValue of Argument[-1];ReturnValue;value",
122122
"java.util;Map;true;putIfAbsent;;;Argument[0];MapKey of Argument[-1];value",
123123
"java.util;Map;true;putIfAbsent;;;Argument[1];MapValue of Argument[-1];value",

java/ql/test/library-tests/frameworks/JaxWs/JakartaRsFlow.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,10 @@ void testAbstractMultivaluedMap(Map<String, List<String>> map1, Map<String, List
166166
map2.put("key", list);
167167
AbstractMultivaluedMap<String, String> amm2 = new MyAbstractMultivaluedMapJak<String, String>(map2);
168168
sink(amm2.get("key").get(0)); // $ hasValueFlow
169+
170+
AbstractMultivaluedMap<String, String> amm3 = new MyAbstractMultivaluedMapJak<String, String>(null);
171+
amm3.put("key", list);
172+
sink(amm3.get("key").get(0)); // $ hasValueFlow
169173
}
170174

171175
void testMultivaluedHashMap(Map<String, String> map1, Map<String, String> map2,
@@ -407,4 +411,4 @@ void testUriBuilder() throws Exception {
407411

408412
class DummyJakarta {
409413
private static Set<String> foo() { return null; }
410-
}
414+
}

java/ql/test/stubs/jsr311-api-1.1.1/javax/ws/rs/core/Cookie.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,8 @@ public String getDomain() {
151151
public String getPath() {
152152
return null;
153153
}
154+
155+
public String toString() {
156+
return null;
157+
}
154158
}

0 commit comments

Comments
 (0)