Skip to content

Commit d46ecad

Browse files
committed
Rust: Handle pub extern crate in path resolution
1 parent 8668473 commit d46ecad

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

rust/ql/lib/codeql/rust/internal/PathResolution.qll

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,8 +259,7 @@ abstract class ItemNode extends Locatable {
259259
kind.isInternal() and
260260
useOpt.isNone()
261261
or
262-
externCrateEdge(this, name, result) and
263-
kind.isInternal() and
262+
externCrateEdge(this, name, kind, result) and
264263
useOpt.isNone()
265264
or
266265
macroExportEdge(this, name, result) and
@@ -276,7 +275,7 @@ abstract class ItemNode extends Locatable {
276275
result = use_.getASuccessor(name, kind, _)
277276
)
278277
or
279-
exists(ExternCrateItemNode ec | result = ec.(ItemNode).getASuccessor(name, kind, useOpt) |
278+
exists(ExternCrateItemNode ec | result = ec.getASuccessor(name, kind, useOpt) |
280279
ec = this.getASuccessor(_, _, _)
281280
or
282281
// if the extern crate appears in the crate root, then the crate name is also added
@@ -527,7 +526,7 @@ class ExternCrateItemNode extends ItemNode instanceof ExternCrate {
527526

528527
override Namespace getNamespace() { none() }
529528

530-
override Visibility getVisibility() { none() }
529+
override Visibility getVisibility() { result = ExternCrate.super.getVisibility() }
531530

532531
override Attr getAnAttr() { result = ExternCrate.super.getAnAttr() }
533532

@@ -2077,8 +2076,11 @@ private predicate useImportEdge(Use use, string name, ItemNode item, SuccessorKi
20772076

20782077
/** Holds if `ec` imports `crate` as `name`. */
20792078
pragma[nomagic]
2080-
private predicate externCrateEdge(ExternCrateItemNode ec, string name, CrateItemNode crate) {
2079+
private predicate externCrateEdge(
2080+
ExternCrateItemNode ec, string name, SuccessorKind kind, CrateItemNode crate
2081+
) {
20812082
name = ec.getName() and
2083+
(if ec.isPublic() then kind.isBoth() else kind.isInternal()) and
20822084
exists(SourceFile f, string s |
20832085
ec.getFile() = f.getFile() and
20842086
s = ec.(ExternCrate).getIdentifier().getText()

0 commit comments

Comments
 (0)