@@ -45,6 +45,17 @@ private class NokogiriXmlParserCall extends XmlParserCall::Range, DataFlow::Call
45
45
}
46
46
}
47
47
48
+ /** Execution of a XPath statement. */
49
+ private class NokogiriXPathExecution extends XPathExecution:: Range , DataFlow:: CallNode {
50
+ NokogiriXPathExecution ( ) {
51
+ exists ( NokogiriXmlParserCall parserCall |
52
+ this = parserCall .getAMethodCall ( [ "xpath" , "at_xpath" , "search" , "at" ] )
53
+ )
54
+ }
55
+
56
+ override DataFlow:: Node getXPath ( ) { result = this .getArgument ( 0 ) }
57
+ }
58
+
48
59
/**
49
60
* Holds if `assign` enables the `default_substitute_entities` option in
50
61
* libxml-ruby.
@@ -123,6 +134,40 @@ private predicate xmlMiniEntitySubstitutionEnabled() {
123
134
enablesLibXmlDefaultEntitySubstitution ( _)
124
135
}
125
136
137
+ /** Execution of a XPath statement. */
138
+ private class LibXmlXPathExecution extends XPathExecution:: Range , DataFlow:: CallNode {
139
+ LibXmlXPathExecution ( ) {
140
+ exists ( LibXmlRubyXmlParserCall parserCall |
141
+ this = parserCall .getAMethodCall ( [ "find" , "find_first" ] )
142
+ )
143
+ }
144
+
145
+ override DataFlow:: Node getXPath ( ) { result = this .getArgument ( 0 ) }
146
+ }
147
+
148
+ /** A call to `REXML::Document.new`, considered as a XML parsing. */
149
+ private class RexmlParserCall extends XmlParserCall:: Range , DataFlow:: CallNode {
150
+ RexmlParserCall ( ) {
151
+ this = API:: getTopLevelMember ( "REXML" ) .getMember ( "Document" ) .getAnInstantiation ( )
152
+ }
153
+
154
+ override DataFlow:: Node getInput ( ) { result = this .getArgument ( 0 ) }
155
+
156
+ /** No option for parsing */
157
+ override predicate externalEntitiesEnabled ( ) { none ( ) }
158
+ }
159
+
160
+ /** Execution of a XPath statement. */
161
+ private class RexmlXPathExecution extends XPathExecution:: Range , DataFlow:: CallNode {
162
+ RexmlXPathExecution ( ) {
163
+ this =
164
+ [ API:: getTopLevelMember ( "REXML" ) .getMember ( "XPath" ) , API:: getTopLevelMember ( "XPath" ) ]
165
+ .getAMethodCall ( [ "each" , "first" , "match" ] )
166
+ }
167
+
168
+ override DataFlow:: Node getXPath ( ) { result = this .getArgument ( 1 ) }
169
+ }
170
+
126
171
/**
127
172
* A call to `ActiveSupport::XmlMini.parse` considered as an `XmlParserCall`.
128
173
*/
0 commit comments