@@ -105,4 +105,67 @@ module StringBreak {
105
105
106
106
override Quote getQuote ( ) { result = quote }
107
107
}
108
+
109
+ class StringsNewReplacerCall extends DataFlow:: CallNode {
110
+ StringsNewReplacerCall ( ) { this .getTarget ( ) .hasQualifiedName ( "strings" , "NewReplacer" ) }
111
+
112
+ DataFlow:: Node getAReplacedArgument ( ) {
113
+ exists ( int m , int n | m = 2 * n and n = m / 2 and result = getArgument ( m ) )
114
+ }
115
+ }
116
+
117
+ class StringsNewReplacerConfiguration extends DataFlow2:: Configuration {
118
+ StringsNewReplacerConfiguration ( ) { this = "StringsNewReplacerConfiguration" }
119
+
120
+ override predicate isSource ( DataFlow:: Node source ) { source instanceof StringsNewReplacerCall }
121
+
122
+ override predicate isSink ( DataFlow:: Node sink ) {
123
+ exists ( DataFlow:: MethodCallNode call |
124
+ sink = call .getReceiver ( ) and
125
+ call .getTarget ( ) .hasQualifiedName ( "strings" , "Replacer" , [ "Replace" , "WriteString" ] )
126
+ )
127
+ }
128
+ }
129
+
130
+ /**
131
+ * A call to `strings.Replacer.Replace`, considered as a sanitizer for unsafe
132
+ * quoting.
133
+ */
134
+ class ReplacerReplaceSanitizer extends DataFlow:: MethodCallNode , Sanitizer {
135
+ Quote quote ;
136
+
137
+ ReplacerReplaceSanitizer ( ) {
138
+ exists ( StringsNewReplacerConfiguration config , DataFlow:: Node source , DataFlow:: Node sink |
139
+ config .hasFlow ( source , sink ) and
140
+ this .getTarget ( ) .hasQualifiedName ( "strings" , "Replacer" , "Replace" ) and
141
+ sink = this .getReceiver ( ) and
142
+ quote = source .( StringsNewReplacerCall ) .getAReplacedArgument ( ) .getStringValue ( )
143
+ )
144
+ }
145
+
146
+ override Quote getQuote ( ) { result = quote }
147
+ }
148
+
149
+ /**
150
+ * A call to `strings.Replacer.WriteString`, considered as a sanitizer for
151
+ * unsafe quoting.
152
+ */
153
+ class ReplacerWriteStringSanitizer extends Sanitizer {
154
+ Quote quote ;
155
+
156
+ ReplacerWriteStringSanitizer ( ) {
157
+ exists (
158
+ StringsNewReplacerConfiguration config , DataFlow:: Node source , DataFlow:: Node sink ,
159
+ DataFlow:: MethodCallNode call
160
+ |
161
+ config .hasFlow ( source , sink ) and
162
+ call .getTarget ( ) .hasQualifiedName ( "strings" , "Replacer" , "WriteString" ) and
163
+ sink = call .getReceiver ( ) and
164
+ this = call .getArgument ( 1 ) and
165
+ quote = source .( StringsNewReplacerCall ) .getAReplacedArgument ( ) .getStringValue ( )
166
+ )
167
+ }
168
+
169
+ override Quote getQuote ( ) { result = quote }
170
+ }
108
171
}
0 commit comments