Skip to content

Commit 55b9724

Browse files
committed
JS: Add store step into namespace re-export specifier
1 parent 0a7af90 commit 55b9724

File tree

4 files changed

+24
-1
lines changed

4 files changed

+24
-1
lines changed

javascript/ql/lib/semmle/javascript/ApiGraphs.qll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import javascript
99
private import semmle.javascript.dataflow.internal.FlowSteps as FlowSteps
10+
private import semmle.javascript.dataflow.internal.PreCallGraphStep
1011
private import internal.CachedStages
1112

1213
/**
@@ -769,6 +770,12 @@ module API {
769770
rhs = m.getAnExportedValue(prop)
770771
)
771772
or
773+
// In general, turn store steps into member steps for def-nodes
774+
exists(string prop |
775+
PreCallGraphStep::storeStep(rhs, pred, prop) and
776+
lbl = Label::member(prop)
777+
)
778+
or
772779
exists(DataFlow::FunctionNode fn |
773780
fn = pred and
774781
lbl = Label::return()

javascript/ql/lib/semmle/javascript/ES2015Modules.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,9 @@ class ExportNamedDeclaration extends ExportDeclaration, @export_named_declaratio
510510
or
511511
exists(ReExportDeclaration red | red = this |
512512
result = red.getReExportedES2015Module().getAnExport().getSourceNode(spec.getLocalName())
513+
or
514+
spec instanceof ExportNamespaceSpecifier and
515+
result = DataFlow::valueNode(spec)
513516
)
514517
)
515518
}
@@ -524,6 +527,19 @@ class ExportNamedDeclaration extends ExportDeclaration, @export_named_declaratio
524527
ExportSpecifier getASpecifier() { result = this.getSpecifier(_) }
525528
}
526529

530+
private import semmle.javascript.dataflow.internal.PreCallGraphStep
531+
532+
private class ExportNamespaceStep extends PreCallGraphStep {
533+
override predicate storeStep(DataFlow::Node pred, DataFlow::SourceNode succ, string prop) {
534+
exists(ExportNamedDeclaration exprt, ExportNamespaceSpecifier spec |
535+
spec = exprt.getASpecifier() and
536+
pred =
537+
exprt.(ReExportDeclaration).getReExportedES2015Module().getAnExport().getSourceNode(prop) and
538+
succ = DataFlow::valueNode(spec)
539+
)
540+
}
541+
}
542+
527543
/**
528544
* An export declaration with the `type` modifier.
529545
*/

javascript/ql/lib/semmle/javascript/dataflow/Sources.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ module SourceNode {
322322
astNode instanceof FunctionBindExpr or
323323
astNode instanceof DynamicImportExpr or
324324
astNode instanceof ImportSpecifier or
325+
astNode instanceof ExportNamespaceSpecifier or
325326
astNode instanceof ImportMetaExpr or
326327
astNode instanceof TaggedTemplateExpr or
327328
astNode instanceof Templating::PipeRefExpr or
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +0,0 @@
1-
| lib/esmodule-reexported2.js:1:26:1:137 | /* def= ... wo") */ | def moduleImport("reexport").getMember("exports").getMember("esmodule") has no outgoing edge labelled getMember("lib2"); it does have outgoing edges labelled getMember("one"). |

0 commit comments

Comments
 (0)