summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin (Kun) "Kassimo" Qian <kevinkassimo@gmail.com>2019-03-26 19:47:17 -0700
committerRyan Dahl <ry@tinyclouds.org>2019-03-26 22:47:17 -0400
commit5c4189a3b8aa80e05088a4b01ecd5eccdd1540fb (patch)
treef8aaf82c29268daeaab196864022746752e6de50
parentd78b4112c65b77dbf1839f06c0776a7e4691fb25 (diff)
Do not close file on invalid seek mode (#2004)
-rw-r--r--cli/resources.rs23
-rw-r--r--js/files_test.ts6
2 files changed, 18 insertions, 11 deletions
diff --git a/cli/resources.rs b/cli/resources.rs
index 385b3d5ca..76004ae50 100644
--- a/cli/resources.rs
+++ b/cli/resources.rs
@@ -449,17 +449,6 @@ pub fn seek(
match maybe_repr {
None => panic!("bad rid"),
Some(Repr::FsFile(f)) => {
- let seek_from = match whence {
- 0 => SeekFrom::Start(offset as u64),
- 1 => SeekFrom::Current(i64::from(offset)),
- 2 => SeekFrom::End(i64::from(offset)),
- _ => {
- return Box::new(futures::future::err(errors::new(
- errors::ErrorKind::InvalidSeekMode,
- format!("Invalid seek mode: {}", whence),
- )));
- }
- };
// Trait Clone not implemented on tokio::fs::File,
// so convert to std File first.
let std_file = f.into_std();
@@ -475,6 +464,18 @@ pub fn seek(
resource.rid,
Repr::FsFile(tokio_fs::File::from_std(std_file)),
);
+ // Translate seek mode to Rust repr.
+ let seek_from = match whence {
+ 0 => SeekFrom::Start(offset as u64),
+ 1 => SeekFrom::Current(i64::from(offset)),
+ 2 => SeekFrom::End(i64::from(offset)),
+ _ => {
+ return Box::new(futures::future::err(errors::new(
+ errors::ErrorKind::InvalidSeekMode,
+ format!("Invalid seek mode: {}", whence),
+ )));
+ }
+ };
if maybe_std_file_copy.is_err() {
return Box::new(futures::future::err(DenoError::from(
maybe_std_file_copy.unwrap_err(),
diff --git a/js/files_test.ts b/js/files_test.ts
index 7e5bbf5f0..0decd9f00 100644
--- a/js/files_test.ts
+++ b/js/files_test.ts
@@ -198,4 +198,10 @@ testPerm({ read: true }, async function seekMode() {
assert(!!err);
assertEquals(err.kind, Deno.ErrorKind.InvalidSeekMode);
assertEquals(err.name, "InvalidSeekMode");
+
+ // We should still be able to read the file
+ // since it is still open.
+ let buf = new Uint8Array(1);
+ await file.read(buf); // "H"
+ assertEquals(new TextDecoder().decode(buf), "H");
});