Fix crash with invalid working directory

This commit is contained in:
Christian Duerr 2020-01-12 01:24:56 +01:00 committed by GitHub
parent a82df6ac43
commit 09ed64bd36
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 14 additions and 21 deletions

View File

@ -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 - Pressing additional modifiers for mouse bindings will no longer trigger them
- Renamed `WINIT_HIDPI_FACTOR` environment variable to `WINIT_X11_SCALE_FACTOR` - Renamed `WINIT_HIDPI_FACTOR` environment variable to `WINIT_X11_SCALE_FACTOR`
- Print an error instead of crashing, when startup working directory is invalid
### Fixed ### Fixed

View File

@ -16,7 +16,7 @@ use std::cmp::max;
use std::path::PathBuf; use std::path::PathBuf;
use clap::{crate_authors, crate_description, crate_name, crate_version, App, Arg}; 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::config::{Delta, Dimensions, Shell, DEFAULT_NAME};
use alacritty_terminal::index::{Column, Line}; use alacritty_terminal::index::{Column, Line};
@ -260,12 +260,14 @@ impl Options {
} }
pub fn into_config(self, mut config: Config) -> Config { 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 { if let Some(lcr) = self.live_config_reload {
config.set_live_config_reload(lcr); 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.shell = self.command.or(config.shell);
config.hold = self.hold; config.hold = self.hold;

View File

@ -15,7 +15,7 @@
use std::borrow::Cow; use std::borrow::Cow;
use std::collections::HashMap; use std::collections::HashMap;
use std::fmt::Display; use std::fmt::Display;
use std::path::{Path, PathBuf}; use std::path::PathBuf;
use log::error; use log::error;
use serde::{Deserialize, Deserializer}; use serde::{Deserialize, Deserializer};
@ -119,7 +119,7 @@ pub struct Config<T> {
/// Shell startup directory /// Shell startup directory
#[serde(default, deserialize_with = "option_explicit_none")] #[serde(default, deserialize_with = "option_explicit_none")]
working_directory: Option<PathBuf>, pub working_directory: Option<PathBuf>,
/// Debug options /// Debug options
#[serde(default, deserialize_with = "failure_default")] #[serde(default, deserialize_with = "failure_default")]
@ -207,16 +207,6 @@ impl<T> Config<T> {
pub fn background_opacity(&self) -> f32 { pub fn background_opacity(&self) -> f32 {
self.background_opacity.0 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<PathBuf>) {
self.working_directory = working_directory;
}
} }
#[serde(default)] #[serde(default)]

View File

@ -208,7 +208,7 @@ pub fn new<C>(config: &Config<C>, size: &SizeInfo, window_id: Option<usize>) ->
} }
// Handle set working directory 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); builder.current_dir(dir);
} }

View File

@ -204,9 +204,9 @@ pub fn new<C>(config: &Config<C>, size: &SizeInfo, _window_id: Option<usize>) ->
let cmdline = win32_string(&cmdline(&config)); let cmdline = win32_string(&cmdline(&config));
let cwd = config let cwd = config
.working_directory() .working_directory
.map(|dir| dir.canonicalize().unwrap()) .as_ref()
.map(|path| win32_string(&path)); .map(|pb| win32_string(&pb.as_path().canonicalize().unwrap()));
let mut proc_info: PROCESS_INFORMATION = Default::default(); let mut proc_info: PROCESS_INFORMATION = Default::default();
unsafe { unsafe {

View File

@ -42,7 +42,7 @@ pub fn new<C>(config: &Config<C>, size: &SizeInfo, _window_id: Option<usize>) ->
let (conin, conout) = (agent.conin_name(), agent.conout_name()); let (conin, conout) = (agent.conin_name(), agent.conout_name());
let cmdline = cmdline(&config); 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 // Spawn process
let spawnconfig = SpawnConfig::new( let spawnconfig = SpawnConfig::new(