@@ -152,15 +152,20 @@ private class ES2015PromiseDefinition extends PromiseDefinition, DataFlow::NewNo
152152}
153153
154154/**
155- * A promise that is resolved with the given value.
155+ * A promise that is created and resolved with one or more value.
156156 */
157- abstract class ResolvedPromiseDefinition extends DataFlow:: CallNode {
157+ abstract class PromiseCreationCall extends DataFlow:: CallNode {
158158 /**
159159 * Gets the value this promise is resolved with.
160160 */
161161 abstract DataFlow:: Node getValue ( ) ;
162162}
163163
164+ /**
165+ * A promise that is created using a `.resolve()` call.
166+ */
167+ abstract class ResolvedPromiseDefinition extends PromiseCreationCall { }
168+
164169/**
165170 * A resolved promise created by the standard ECMAScript 2015 `Promise.resolve` function.
166171 */
@@ -172,6 +177,21 @@ class ResolvedES2015PromiseDefinition extends ResolvedPromiseDefinition {
172177 override DataFlow:: Node getValue ( ) { result = getArgument ( 0 ) }
173178}
174179
180+ /**
181+ * An aggregated promise produced either by `Promise.all` or `Promise.race`.
182+ */
183+ class AggregateES2015PromiseDefinition extends PromiseCreationCall {
184+ AggregateES2015PromiseDefinition ( ) {
185+ exists ( string m | m = "all" or m = "race" |
186+ this = DataFlow:: globalVarRef ( "Promise" ) .getAMemberCall ( m )
187+ )
188+ }
189+
190+ override DataFlow:: Node getValue ( ) {
191+ result = getArgument ( 0 ) .getALocalSource ( ) .( DataFlow:: ArrayCreationNode ) .getAnElement ( )
192+ }
193+ }
194+
175195/**
176196 * A data flow edge from a promise reaction to the corresponding handler.
177197 */
@@ -197,7 +217,7 @@ predicate promiseTaintStep(DataFlow::Node pred, DataFlow::Node succ) {
197217 pred = succ .( PromiseDefinition ) .getResolveParameter ( ) .getACall ( ) .getArgument ( 0 )
198218 or
199219 // from `x` to `Promise.resolve(x)`
200- pred = succ .( ResolvedPromiseDefinition ) .getValue ( )
220+ pred = succ .( PromiseCreationCall ) .getValue ( )
201221 or
202222 exists ( DataFlow:: MethodCallNode thn , DataFlow:: FunctionNode cb |
203223 thn .getMethodName ( ) = "then" and cb = thn .getCallback ( 0 )
0 commit comments