@@ -2308,6 +2308,31 @@ private predicate readStepDelegateCall(Node node1, ContentSet c, OutNode node2)
23082308 )
23092309}
23102310
2311+ /**
2312+ * Holds if data can flow from `node1` to `node2` via a property pattern.
2313+ */
2314+ private predicate fieldOrPropertyPatternRead(Node node1, ContentSet c, Node node2) {
2315+ exists(PatternExpr pattern, LabeledPatternExpr label, Property p |
2316+ node1.asExpr() = pattern and
2317+ (
2318+ pattern.(RecursivePatternExpr).getPropertyPatterns().getPattern(_) = label
2319+ or
2320+ pattern.(PropertyPatternExpr).getPattern(_) = label
2321+ ) and
2322+ c.isProperty(p) and
2323+ p.getName() = label.getLabel()
2324+ |
2325+ node2.asExpr() = label.(RecursivePatternExpr)
2326+ or
2327+ node2.asExpr() = label.(PropertyPatternExpr)
2328+ or
2329+ exists(AssignableDefinitions::PatternDefinition lvd |
2330+ node2.(AssignableDefinitionNode).getDefinition() = lvd and
2331+ label.(BindingPatternExpr).getVariableDeclExpr() = lvd.getDeclaration()
2332+ )
2333+ )
2334+ }
2335+
23112336/**
23122337 * Holds if data can flow from `node1` to `node2` via a read of content `c`.
23132338 */
@@ -2319,6 +2344,8 @@ predicate readStep(Node node1, ContentSet c, Node node2) {
23192344 or
23202345 fieldOrPropertyRead(node1.asExpr(), c, node2.asExpr())
23212346 or
2347+ fieldOrPropertyPatternRead(node1, c, node2)
2348+ or
23222349 dynamicPropertyRead(node1.asExpr(), c, node2.asExpr())
23232350 or
23242351 node2.asExpr().(AwaitExpr).getExpr() = node1.asExpr() and
0 commit comments