about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2023-03-25 14:22:05 +0100
committerLukas Wirth <lukastw97@gmail.com>2023-03-25 14:22:05 +0100
commitc01ba4a3101e343464093603b12bb5327d8a320f (patch)
tree9a88b807e6a10c6224888f959c5b2a36f9111c40
parent6d7511938a8864ccfa0a32d4884d9b92b0a37048 (diff)
downloadrust-c01ba4a3101e343464093603b12bb5327d8a320f.tar.gz
rust-c01ba4a3101e343464093603b12bb5327d8a320f.zip
Reject symlinks in project-json
-rw-r--r--crates/project-model/src/workspace.rs8
1 files changed, 7 insertions, 1 deletions
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index d1e53e12eeb..2158485a330 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -4,7 +4,7 @@
 
 use std::{collections::VecDeque, fmt, fs, process::Command, sync::Arc};
 
-use anyhow::{format_err, Context, Result};
+use anyhow::{bail, format_err, Context, Result};
 use base_db::{
     CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency, Edition, Env,
     FileId, LangCrateOrigin, ProcMacroLoadResult, TargetLayoutLoadResult,
@@ -154,6 +154,12 @@ impl ProjectWorkspace {
     ) -> Result<ProjectWorkspace> {
         let res = match manifest {
             ProjectManifest::ProjectJson(project_json) => {
+                let metadata = fs::symlink_metadata(&project_json).with_context(|| {
+                    format!("Failed to read json file {}", project_json.display())
+                })?;
+                if metadata.is_symlink() {
+                    bail!("The project-json may not currently point to a symlink");
+                }
                 let file = fs::read_to_string(&project_json).with_context(|| {
                     format!("Failed to read json file {}", project_json.display())
                 })?;