@@ -16,23 +16,22 @@ class AmbiguousPathCall extends DataFlow::CallNode {
16
16
this .( KernelMethodCall ) .getMethodName ( ) = "open" and
17
17
name = "Kernel.open"
18
18
or
19
- this = API:: getTopLevelMember ( "IO" ) .getAMethodCall ( "read" ) and
20
- not this = API:: getTopLevelMember ( "File" ) .getAMethodCall ( "read" ) and // needed in e.g. opal/opal, where some calls have both paths, but I'm not sure why
19
+ methodCallOnlyOnIO ( this , "read" ) and
21
20
name = "IO.read"
22
21
or
23
- this = API :: getTopLevelMember ( "IO" ) . getAMethodCall ( "write" ) and
22
+ methodCallOnlyOnIO ( this , "write" ) and
24
23
name = "IO.write"
25
24
or
26
- this = API :: getTopLevelMember ( "IO" ) . getAMethodCall ( "binread" ) and
25
+ methodCallOnlyOnIO ( this , "binread" ) and
27
26
name = "IO.binread"
28
27
or
29
- this = API :: getTopLevelMember ( "IO" ) . getAMethodCall ( "binwrite" ) and
28
+ methodCallOnlyOnIO ( this , "binwrite" ) and
30
29
name = "IO.binwrite"
31
30
or
32
- this = API :: getTopLevelMember ( "IO" ) . getAMethodCall ( "foreach" ) and
31
+ methodCallOnlyOnIO ( this , "foreach" ) and
33
32
name = "IO.foreach"
34
33
or
35
- this = API :: getTopLevelMember ( "IO" ) . getAMethodCall ( "readlines" ) and
34
+ methodCallOnlyOnIO ( this , "readlines" ) and
36
35
name = "IO.readlines"
37
36
or
38
37
this = API:: getTopLevelMember ( "URI" ) .getAMethodCall ( "open" ) and
@@ -65,6 +64,11 @@ class AmbiguousPathCall extends DataFlow::CallNode {
65
64
DataFlow:: Node getPathArgument ( ) { result = this .getArgument ( 0 ) }
66
65
}
67
66
67
+ predicate methodCallOnlyOnIO ( DataFlow:: CallNode node , string methodName ) {
68
+ node = API:: getTopLevelMember ( "IO" ) .getAMethodCall ( methodName ) and
69
+ not node = API:: getTopLevelMember ( "File" ) .getAMethodCall ( methodName ) // needed in e.g. opal/opal, where some calls have both paths (opal implements an own corelib)
70
+ }
71
+
68
72
/**
69
73
* A sanitizer for kernel open vulnerabilities.
70
74
*/
0 commit comments