@@ -84,15 +84,28 @@ private predicate mayRaiseWithFile(DataFlow::CfgNode file, DataFlow::CfgNode rai
8484}
8585
8686/** 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 ) {
9088 exists ( FileWrapperCall fw | nodeFrom = fw .getWrapped ( ) and nodeTo = fw )
9189}
9290
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+
93105/** 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 ) )
96109}
97110
98111/** Holds if the file opened at `fo` is closed. */
0 commit comments