@@ -56,25 +56,39 @@ module RegexUseFlow = DataFlow::Global<RegexUseConfig>;
5656 * flags from the point they are set to the point of use. The flow state
5757 * encodes which parse mode flag was set.
5858 */
59- private module RegexParseModeConfig implements DataFlow:: ConfigSig {
60- predicate isSource ( DataFlow:: Node node ) {
61- // parse mode flag is set
62- any ( RegexAdditionalFlowStep s ) .modifiesParseMode ( _, node , MkDotAll ( ) , true )
63- }
59+ private module RegexParseModeConfig implements DataFlow:: StateConfigSig {
60+ class FlowState = RegexParseMode ;
6461
65- predicate isBarrierIn ( DataFlow:: Node node ) {
66- // parse mode flag is set or unset
67- any ( RegexAdditionalFlowStep s ) .modifiesParseMode ( _, node , MkDotAll ( ) , _ )
62+ predicate isSource ( DataFlow:: Node node , FlowState flowstate ) {
63+ // parse mode flag is set
64+ any ( RegexAdditionalFlowStep s ) .modifiesParseMode ( _, node , flowstate , true )
6865 }
6966
70- predicate isSink ( DataFlow:: Node node ) {
67+ predicate isSink ( DataFlow:: Node node , FlowState flowstate ) {
7168 // evaluation of the regex
7269 node .asExpr ( ) = any ( RegexEval eval ) .getRegexInput ( )
70+ and
71+ flowstate = any ( FlowState fs )
72+ }
73+
74+ predicate isBarrier ( DataFlow:: Node node ) {
75+ none ( )
76+ }
77+
78+ predicate isBarrier ( DataFlow:: Node node , FlowState flowstate ) {
79+ // parse mode flag is set or unset
80+ any ( RegexAdditionalFlowStep s ) .modifiesParseMode ( node , _, flowstate , _)
7381 }
7482
7583 predicate isAdditionalFlowStep ( DataFlow:: Node nodeFrom , DataFlow:: Node nodeTo ) {
7684 any ( RegexAdditionalFlowStep s ) .step ( nodeFrom , nodeTo )
7785 }
86+
87+ predicate isAdditionalFlowStep (
88+ DataFlow:: Node nodeFrom , FlowState flowstateFrom , DataFlow:: Node nodeTo , FlowState flowStateTo
89+ ) {
90+ none ( )
91+ }
7892}
7993
80- module RegexParseModeFlow = DataFlow:: Global < RegexParseModeConfig > ;
94+ module RegexParseModeFlow = DataFlow:: GlobalWithState < RegexParseModeConfig > ;
0 commit comments