Skip to content

Commit

Permalink
fix: skip non-UTF-8 dir entries in Deno.readDir() (denoland#4004)
Browse files Browse the repository at this point in the history
Example:

		$ python2 -c 'open("\x80\x7F", "w")'

		$ deno eval 'Deno.readDirSync(".")'
		thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', cli/ops/fs.rs:373:16
		note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
		fatal runtime error: failed to initiate panic, error 5
		Aborted (core dumped)

Before this commit they made deno panic, now they are silently skipped.
Not ideal but arguably better than panicking.

No test because what characters are and aren't allowed in filenames is
highly file system-dependent.

Closes denoland#3950
  • Loading branch information
bnoordhuis committed Feb 15, 2020
1 parent a0f015b commit 503d8bf
Showing 1 changed file with 8 additions and 6 deletions.
14 changes: 8 additions & 6 deletions cli/ops/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -365,14 +365,16 @@ fn op_read_dir(
blocking_json(is_sync, move || {
debug!("op_read_dir {}", path.display());
let entries: Vec<_> = fs::read_dir(path)?
.map(|entry| {
.filter_map(|entry| {
let entry = entry.unwrap();
let metadata = entry.metadata().unwrap();
get_stat_json(
metadata,
Some(entry.file_name().to_str().unwrap().to_owned()),
)
.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())
} else {
None
}
})
.collect();

Expand Down

0 comments on commit 503d8bf

Please sign in to comment.