refactor: improve widestring conversion utils

- Don't use `WString::from_str` for `str`s which are available at
  compile-time. Use `L!(input).to_owned()` instead. The reason for this
  is that `WString::from_str` can cause problems if the input contains
  PUA bytes which we use for our custom encoding scheme. In such cases,
  `bytes2wcstring` should be used, to avoid problems when decoding the
  `WString`. Removing harmless usages of `WString::from_str` allows us
  to focus on the potentially dangerous ones which don't convert
  `str`'s that are compiled into the binary.
- Make `cstr2wcstring` actually take `CStr` as its input. The former
  version was only used in one place, and the conversion to `CStr`
  should happen there, where it can be checked that the conversion makes
  sense and is safe. The new version is used in
  `src/env/environmant.rs`, to avoid `to_bytes()` calls cluttering the
  code there.
- Add `osstr2wcstring` function. This function also works for `Path`.
  Now, these types can be converted to widestrings with much less
  syntactic clutter.
This commit is contained in:
Daniel Rainer
2026-01-25 17:19:38 +01:00
committed by Johannes Altmanninger
parent 6a2f531f9b
commit a93c24b084
20 changed files with 102 additions and 115 deletions

View File

@@ -8,7 +8,7 @@
pub mod wcstoi;
use crate::common::{
bytes2wcstring, fish_reserved_codepoint, wcs2bytes, wcs2osstring, wcs2zstring,
bytes2wcstring, fish_reserved_codepoint, osstr2wcstring, wcs2bytes, wcs2osstring, wcs2zstring,
};
use crate::fds::BorrowedFdFile;
use crate::flog;
@@ -93,7 +93,7 @@ pub fn perror_io(s: &str, e: &io::Error) {
/// Wide character version of getcwd().
pub fn wgetcwd() -> WString {
match std::env::current_dir() {
Ok(cwd) => bytes2wcstring(cwd.into_os_string().as_bytes()),
Ok(cwd) => osstr2wcstring(cwd),
Err(e) => {
flog!(error, "std::env::current_dir() failed with error:", e);
WString::new()