From 2b39a9512a1af225da71445bad518a8831bea70d Mon Sep 17 00:00:00 2001 From: Matt Bond Date: Fri, 9 Feb 2024 15:31:14 -0500 Subject: [PATCH] Canonicalize settings to avoid overwriting symlinks (#7632) Release Notes: - Fixed theme selector overwriting settings file symlinks ([#4469](https://github.com/zed-industries/zed/issues/4469)). --- crates/settings/src/settings_file.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/settings/src/settings_file.rs b/crates/settings/src/settings_file.rs index 3a43e3f9dd..7304fc5f1e 100644 --- a/crates/settings/src/settings_file.rs +++ b/crates/settings/src/settings_file.rs @@ -1,9 +1,9 @@ use crate::{settings_store::SettingsStore, Settings}; -use anyhow::Result; +use anyhow::{Context, Result}; use fs::Fs; use futures::{channel::mpsc, StreamExt}; use gpui::{AppContext, BackgroundExecutor}; -use std::{io::ErrorKind, path::PathBuf, str, sync::Arc, time::Duration}; +use std::{io::ErrorKind, path::PathBuf, sync::Arc, time::Duration}; use util::{paths, ResultExt}; pub const EMPTY_THEME_NAME: &'static str = "empty-theme"; @@ -115,7 +115,14 @@ pub fn update_settings_file( let new_text = cx.read_global(|store: &SettingsStore, _cx| { store.new_text_for_update::(old_text, update) })?; - fs.atomic_write(paths::SETTINGS.clone(), new_text).await?; + let initial_path = paths::SETTINGS.as_path(); + let resolved_path = fs + .canonicalize(initial_path) + .await + .with_context(|| format!("Failed to canonicalize settings path {:?}", initial_path))?; + fs.atomic_write(resolved_path.clone(), new_text) + .await + .with_context(|| format!("Failed to write settings to file {:?}", resolved_path))?; anyhow::Ok(()) }) .detach_and_log_err(cx);