1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-23 15:49:44 -05:00

fix: skip non-UTF-8 dir entries in Deno.readDir() (#4004)

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 #3950
This commit is contained in:
Ben Noordhuis 2020-02-15 16:37:05 +01:00 committed by GitHub
parent a0f015b1a3
commit 503d8bfef2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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();