From 09ed64bd365bdb294a29e2e6b0149b0581a1fa81 Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Sun, 12 Jan 2020 01:24:56 +0100 Subject: [PATCH] Fix crash with invalid working directory --- CHANGELOG.md | 1 + alacritty/src/cli.rs | 10 ++++++---- alacritty_terminal/src/config/mod.rs | 14 ++------------ alacritty_terminal/src/tty/unix.rs | 2 +- alacritty_terminal/src/tty/windows/conpty.rs | 6 +++--- alacritty_terminal/src/tty/windows/winpty.rs | 2 +- 6 files changed, 14 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 345dfe3..eb7a736 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Pressing additional modifiers for mouse bindings will no longer trigger them - Renamed `WINIT_HIDPI_FACTOR` environment variable to `WINIT_X11_SCALE_FACTOR` +- Print an error instead of crashing, when startup working directory is invalid ### Fixed diff --git a/alacritty/src/cli.rs b/alacritty/src/cli.rs index a7b9738..7e45e24 100644 --- a/alacritty/src/cli.rs +++ b/alacritty/src/cli.rs @@ -16,7 +16,7 @@ use std::cmp::max; use std::path::PathBuf; use clap::{crate_authors, crate_description, crate_name, crate_version, App, Arg}; -use log::{self, LevelFilter}; +use log::{self, error, LevelFilter}; use alacritty_terminal::config::{Delta, Dimensions, Shell, DEFAULT_NAME}; use alacritty_terminal::index::{Column, Line}; @@ -260,12 +260,14 @@ impl Options { } pub fn into_config(self, mut config: Config) -> Config { + match self.working_dir.or_else(|| config.working_directory.take()) { + Some(ref wd) if !wd.is_dir() => error!("Unable to set working directory to {:?}", wd), + wd => config.working_directory = wd, + } + if let Some(lcr) = self.live_config_reload { config.set_live_config_reload(lcr); } - if let Some(wd) = self.working_dir { - config.set_working_directory(Some(wd)); - } config.shell = self.command.or(config.shell); config.hold = self.hold; diff --git a/alacritty_terminal/src/config/mod.rs b/alacritty_terminal/src/config/mod.rs index f3257b7..d077190 100644 --- a/alacritty_terminal/src/config/mod.rs +++ b/alacritty_terminal/src/config/mod.rs @@ -15,7 +15,7 @@ use std::borrow::Cow; use std::collections::HashMap; use std::fmt::Display; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use log::error; use serde::{Deserialize, Deserializer}; @@ -119,7 +119,7 @@ pub struct Config { /// Shell startup directory #[serde(default, deserialize_with = "option_explicit_none")] - working_directory: Option, + pub working_directory: Option, /// Debug options #[serde(default, deserialize_with = "failure_default")] @@ -207,16 +207,6 @@ impl Config { pub fn background_opacity(&self) -> f32 { self.background_opacity.0 } - - #[inline] - pub fn working_directory(&self) -> Option<&Path> { - self.working_directory.as_ref().map(|path_buf| path_buf.as_path()) - } - - #[inline] - pub fn set_working_directory(&mut self, working_directory: Option) { - self.working_directory = working_directory; - } } #[serde(default)] diff --git a/alacritty_terminal/src/tty/unix.rs b/alacritty_terminal/src/tty/unix.rs index ab34d33..1b01af0 100644 --- a/alacritty_terminal/src/tty/unix.rs +++ b/alacritty_terminal/src/tty/unix.rs @@ -208,7 +208,7 @@ pub fn new(config: &Config, size: &SizeInfo, window_id: Option) -> } // Handle set working directory option - if let Some(ref dir) = config.working_directory() { + if let Some(dir) = &config.working_directory { builder.current_dir(dir); } diff --git a/alacritty_terminal/src/tty/windows/conpty.rs b/alacritty_terminal/src/tty/windows/conpty.rs index 28cdf4c..0bed412 100644 --- a/alacritty_terminal/src/tty/windows/conpty.rs +++ b/alacritty_terminal/src/tty/windows/conpty.rs @@ -204,9 +204,9 @@ pub fn new(config: &Config, size: &SizeInfo, _window_id: Option) -> let cmdline = win32_string(&cmdline(&config)); let cwd = config - .working_directory() - .map(|dir| dir.canonicalize().unwrap()) - .map(|path| win32_string(&path)); + .working_directory + .as_ref() + .map(|pb| win32_string(&pb.as_path().canonicalize().unwrap())); let mut proc_info: PROCESS_INFORMATION = Default::default(); unsafe { diff --git a/alacritty_terminal/src/tty/windows/winpty.rs b/alacritty_terminal/src/tty/windows/winpty.rs index c56ad8f..2eccecb 100644 --- a/alacritty_terminal/src/tty/windows/winpty.rs +++ b/alacritty_terminal/src/tty/windows/winpty.rs @@ -42,7 +42,7 @@ pub fn new(config: &Config, size: &SizeInfo, _window_id: Option) -> let (conin, conout) = (agent.conin_name(), agent.conout_name()); let cmdline = cmdline(&config); - let cwd = config.working_directory().map(|dir| dir.canonicalize().unwrap()); + let cwd = config.working_directory.as_ref().map(|pb| pb.as_path().canonicalize().unwrap()); // Spawn process let spawnconfig = SpawnConfig::new(