diff --git a/cli/tests/unit/read_dir_test.ts b/cli/tests/unit/read_dir_test.ts index 4a0719a4b5..829f7bfa22 100644 --- a/cli/tests/unit/read_dir_test.ts +++ b/cli/tests/unit/read_dir_test.ts @@ -78,3 +78,23 @@ unitTest({ perms: { read: false } }, async function readDirPerm(): Promise< await Deno.readDir("tests/")[Symbol.asyncIterator]().next(); }, Deno.errors.PermissionDenied); }); + +unitTest( + { perms: { read: true }, ignore: Deno.build.os == "windows" }, + async function readDirDevFd(): Promise< + void + > { + for await (const _ of Deno.readDir("/dev/fd")) { + // We don't actually care whats in here; just that we don't panic on non regular entries + } + }, +); + +unitTest( + { perms: { read: true }, ignore: Deno.build.os == "windows" }, + function readDirDevFdSync(): void { + for (const _ of Deno.readDirSync("/dev/fd")) { + // We don't actually care whats in here; just that we don't panic on non regular file entries + } + }, +); diff --git a/runtime/ops/fs.rs b/runtime/ops/fs.rs index d1242b116e..629afbfe65 100644 --- a/runtime/ops/fs.rs +++ b/runtime/ops/fs.rs @@ -1022,20 +1022,19 @@ fn op_read_dir_sync( let entries: Vec<_> = std::fs::read_dir(path)? .filter_map(|entry| { let entry = entry.unwrap(); - let file_type = entry.file_type().unwrap(); // Not all filenames can be encoded as UTF-8. Skip those for now. if let Ok(name) = into_string(entry.file_name()) { Some(json!({ "name": name, - "isFile": file_type.is_file(), - "isDirectory": file_type.is_dir(), - "isSymlink": file_type.is_symlink() + "isFile": entry.file_type().map_or(false, |file_type| file_type.is_file()), + "isDirectory": entry.file_type().map_or(false, |file_type| file_type.is_dir()), + "isSymlink": entry.file_type().map_or(false, |file_type| file_type.is_symlink()), })) } else { None } }) - .collect(); + .collect(); Ok(json!({ "entries": entries })) } @@ -1056,25 +1055,24 @@ async fn op_read_dir_async( let entries: Vec<_> = std::fs::read_dir(path)? .filter_map(|entry| { let entry = entry.unwrap(); - let file_type = entry.file_type().unwrap(); // Not all filenames can be encoded as UTF-8. Skip those for now. if let Ok(name) = into_string(entry.file_name()) { Some(json!({ "name": name, - "isFile": file_type.is_file(), - "isDirectory": file_type.is_dir(), - "isSymlink": file_type.is_symlink() + "isFile": entry.file_type().map_or(false, |file_type| file_type.is_file()), + "isDirectory": entry.file_type().map_or(false, |file_type| file_type.is_dir()), + "isSymlink": entry.file_type().map_or(false, |file_type| file_type.is_symlink()), })) } else { None } }) - .collect(); + .collect(); Ok(json!({ "entries": entries })) }) .await - .unwrap() + .unwrap() } #[derive(Deserialize)]