diff options
-rw-r--r-- | cli/op_error.rs | 4 | ||||
-rw-r--r-- | cli/ops/fs.rs | 24 |
2 files changed, 17 insertions, 11 deletions
diff --git a/cli/op_error.rs b/cli/op_error.rs index 3537d4b28..1d6236c77 100644 --- a/cli/op_error.rs +++ b/cli/op_error.rs @@ -104,6 +104,10 @@ impl OpError { pub fn bad_resource_id() -> OpError { Self::new(ErrorKind::BadResource, "Bad resource ID".to_string()) } + + pub fn invalid_utf8() -> OpError { + Self::new(ErrorKind::InvalidData, "invalid utf8".to_string()) + } } impl Error for OpError {} diff --git a/cli/ops/fs.rs b/cli/ops/fs.rs index 43f3db614..458e1a14c 100644 --- a/cli/ops/fs.rs +++ b/cli/ops/fs.rs @@ -41,6 +41,10 @@ pub fn init(i: &mut Isolate, s: &State) { i.register_op("op_utime", s.stateful_json_op(op_utime)); } +fn into_string(s: std::ffi::OsString) -> Result<String, OpError> { + s.into_string().map_err(|_| OpError::invalid_utf8()) +} + #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct OpenArgs { @@ -597,7 +601,7 @@ fn op_realpath( // CreateFile and GetFinalPathNameByHandle on Windows let realpath = std::fs::canonicalize(&path)?; let mut realpath_str = - realpath.to_str().unwrap().to_owned().replace("\\", "/"); + into_string(realpath.into_os_string())?.replace("\\", "/"); if cfg!(windows) { realpath_str = realpath_str.trim_start_matches("//?/").to_string(); } @@ -630,9 +634,8 @@ fn op_read_dir( let entry = entry.unwrap(); let metadata = entry.metadata().unwrap(); // Not all filenames can be encoded as UTF-8. Skip those for now. - if let Some(filename) = entry.file_name().to_str() { - let filename = Some(filename.to_owned()); - Some(get_stat_json(metadata, filename).unwrap()) + if let Ok(filename) = into_string(entry.file_name()) { + Some(get_stat_json(metadata, Some(filename)).unwrap()) } else { None } @@ -759,10 +762,9 @@ fn op_read_link( let is_sync = args.promise_id.is_none(); blocking_json(is_sync, move || { debug!("op_read_link {}", path.display()); - let path = std::fs::read_link(&path)?; - let path_str = path.to_str().unwrap(); - - Ok(json!(path_str)) + let target = std::fs::read_link(&path)?.into_os_string(); + let targetstr = into_string(target)?; + Ok(json!(targetstr)) }) } @@ -873,7 +875,7 @@ fn op_make_temp_dir( suffix.as_ref().map(|x| &**x), true, )?; - let path_str = path.to_str().unwrap(); + let path_str = into_string(path.into_os_string())?; Ok(json!(path_str)) }) @@ -904,7 +906,7 @@ fn op_make_temp_file( suffix.as_ref().map(|x| &**x), false, )?; - let path_str = path.to_str().unwrap(); + let path_str = into_string(path.into_os_string())?; Ok(json!(path_str)) }) @@ -943,6 +945,6 @@ fn op_cwd( _zero_copy: Option<ZeroCopyBuf>, ) -> Result<JsonOp, OpError> { let path = current_dir()?; - let path_str = path.into_os_string().into_string().unwrap(); + let path_str = into_string(path.into_os_string())?; Ok(JsonOp::Sync(json!(path_str))) } |