@@ -45,6 +45,17 @@ private class NokogiriXmlParserCall extends XmlParserCall::Range, DataFlow::Call
4545 }
4646}
4747
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+
4859/**
4960 * Holds if `assign` enables the `default_substitute_entities` option in
5061 * libxml-ruby.
@@ -123,6 +134,40 @@ private predicate xmlMiniEntitySubstitutionEnabled() {
123134 enablesLibXmlDefaultEntitySubstitution ( _)
124135}
125136
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+
126171/**
127172 * A call to `ActiveSupport::XmlMini.parse` considered as an `XmlParserCall`.
128173 */
0 commit comments