@@ -84,15 +84,28 @@ private predicate mayRaiseWithFile(DataFlow::CfgNode file, DataFlow::CfgNode rai
84
84
}
85
85
86
86
/** Holds if data flows from `nodeFrom` to `nodeTo` in one step that also includes file wrapper classes. */
87
- private predicate fileLocalFlowStep ( DataFlow:: Node nodeFrom , DataFlow:: Node nodeTo ) {
88
- DataFlow:: localFlowStep ( nodeFrom , nodeTo )
89
- or
87
+ private predicate fileAdditionalLocalFlowStep ( DataFlow:: Node nodeFrom , DataFlow:: Node nodeTo ) {
90
88
exists ( FileWrapperCall fw | nodeFrom = fw .getWrapped ( ) and nodeTo = fw )
91
89
}
92
90
91
+ private predicate fileLocalFlowHelper0 (
92
+ DataFlow:: LocalSourceNode nodeFrom , DataFlow:: LocalSourceNode nodeTo
93
+ ) {
94
+ exists ( DataFlow:: Node nodeMid |
95
+ nodeFrom .flowsTo ( nodeMid ) and fileAdditionalLocalFlowStep ( nodeMid , nodeTo )
96
+ )
97
+ }
98
+
99
+ private predicate fileLocalFlowHelper1 (
100
+ DataFlow:: LocalSourceNode nodeFrom , DataFlow:: LocalSourceNode nodeTo
101
+ ) {
102
+ fileLocalFlowHelper0 * ( nodeFrom , nodeTo )
103
+ }
104
+
93
105
/** Holds if data flows from `source` to `sink`, including file wrapper classes. */
94
- private predicate fileLocalFlow ( DataFlow:: Node source , DataFlow:: Node sink ) {
95
- fileLocalFlowStep * ( source , sink )
106
+ pragma [ inline]
107
+ private predicate fileLocalFlow ( FileOpen source , DataFlow:: Node sink ) {
108
+ exists ( DataFlow:: LocalSourceNode mid | fileLocalFlowHelper1 ( source , mid ) and mid .flowsTo ( sink ) )
96
109
}
97
110
98
111
/** Holds if the file opened at `fo` is closed. */
0 commit comments