Skip to content

Commit 50b0e83

Browse files
committed
Handle non-UTF-8 paths and empty XDG_* variables
1 parent 250c9f0 commit 50b0e83

File tree

1 file changed

+22
-21
lines changed

1 file changed

+22
-21
lines changed

src/fdo_magic/builtin/runtime.rs

+22-21
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
//! Enable loading the magic database files at runtime rather than embedding the GPLed database
22
3-
use std::env;
3+
use std::env::{split_paths, var_os};
4+
use std::ffi::OsString;
45
use std::fs::{read, read_to_string};
5-
use std::path::PathBuf;
6+
use std::path::{Path, PathBuf};
67

78
use fnv::FnvHashMap;
89
use once_cell::sync::OnceCell;
@@ -12,31 +13,31 @@ use super::MagicRule;
1213
use crate::fdo_magic::ruleset;
1314
use crate::Mime;
1415

15-
fn paths_from_env_var(var: &str, filename: &str, buffer: &mut Vec<PathBuf>) {
16-
for dir in var.split(':') {
17-
buffer.push(PathBuf::from(dir).join("mime").join(filename));
18-
}
16+
fn mime_path(base: &Path, filename: &str) -> PathBuf {
17+
base.join("mime").join(filename)
1918
}
2019

2120
fn search_paths(filename: &str) -> Vec<PathBuf> {
22-
let mut search_paths: Vec<PathBuf> = Vec::new();
23-
let dirs = env::var("XDG_DATA_DIRS").unwrap_or("/usr/local/share/:/usr/share/".to_string());
24-
paths_from_env_var(&dirs, filename, &mut search_paths);
21+
let mut paths = Vec::new();
22+
23+
let data_dirs = match var_os("XDG_DATA_DIRS") {
24+
Some(dirs) if !dirs.is_empty() => dirs,
25+
_ => OsString::from("/usr/local/share/:/usr/share/"),
26+
};
27+
paths.extend(split_paths(&data_dirs).map(|base| mime_path(&base, filename)));
2528

26-
let dirs = env::var("XDG_DATA_HOME").or_else(|_| {
27-
env::var("HOME").map(|home| {
28-
PathBuf::from(home)
29-
.join(".local/share")
30-
.to_string_lossy()
31-
.to_string()
32-
})
33-
});
34-
if let Ok(dirs) = dirs {
35-
paths_from_env_var(&dirs, filename, &mut search_paths);
29+
let data_home = match var_os("XDG_DATA_HOME") {
30+
Some(data_home) if !data_home.is_empty() => Some(PathBuf::from(data_home)),
31+
_ => var_os("HOME").map(|home| Path::new(&home).join(".local/share")),
32+
};
33+
if let Some(data_home) = data_home {
34+
paths.push(mime_path(&data_home, filename));
3635
}
36+
3737
#[cfg(target_os = "macos")]
38-
paths_from_env_var("/opt/homebrew/share", filename, &mut search_paths);
39-
search_paths
38+
paths.push(mime_path(Path::new("/opt/homebrew/share"), filename));
39+
40+
paths
4041
}
4142

4243
/// Load the magic database from the predefined locations in the XDG standard

0 commit comments

Comments
 (0)