summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasper Beyer <caspervonb@pm.me>2021-02-26 01:35:10 +0800
committerGitHub <noreply@github.com>2021-02-25 18:35:10 +0100
commitaa47f8186cbc068232e23b92a6966be9bd23e4bb (patch)
tree0c9c2e455e0700d2a674aa24b0e14f9a5860b83f
parentcdae4423c27443e0085d59f45eda1c978f186a1c (diff)
feat(runtime): stabilize Deno.link and Deno.linkSync (#9417)
This commit makes "Deno.link" and "Deno.linkSync" stable. The permission required has been changed to read-write to ensure one cannot escape the sandbox.
-rw-r--r--cli/diagnostics.rs2
-rw-r--r--cli/dts/lib.deno.ns.d.ts21
-rw-r--r--cli/dts/lib.deno.unstable.d.ts22
-rw-r--r--runtime/js/90_deno_ns.js4
-rw-r--r--runtime/ops/fs.rs7
5 files changed, 27 insertions, 29 deletions
diff --git a/cli/diagnostics.rs b/cli/diagnostics.rs
index 1da2f277e..5b2ce3641 100644
--- a/cli/diagnostics.rs
+++ b/cli/diagnostics.rs
@@ -44,8 +44,6 @@ const UNSTABLE_DENO_PROPS: &[&str] = &[
"ftruncateSync",
"hostname",
"kill",
- "link",
- "linkSync",
"listen",
"listenDatagram",
"loadavg",
diff --git a/cli/dts/lib.deno.ns.d.ts b/cli/dts/lib.deno.ns.d.ts
index 15088934a..aa10ce3af 100644
--- a/cli/dts/lib.deno.ns.d.ts
+++ b/cli/dts/lib.deno.ns.d.ts
@@ -265,6 +265,27 @@ declare namespace Deno {
*/
export function cwd(): string;
+ /**
+ * Synchronously creates `newpath` as a hard link to `oldpath`.
+ *
+ * ```ts
+ * Deno.linkSync("old/name", "new/name");
+ * ```
+ *
+ * Requires `allow-read` and `allow-write` permissions. */
+ export function linkSync(oldpath: string, newpath: string): void;
+
+ /**
+ *
+ * Creates `newpath` as a hard link to `oldpath`.
+ *
+ * ```ts
+ * await Deno.link("old/name", "new/name");
+ * ```
+ *
+ * Requires `allow-read` and `allow-write` permissions. */
+ export function link(oldpath: string, newpath: string): Promise<void>;
+
export enum SeekMode {
Start = 0,
Current = 1,
diff --git a/cli/dts/lib.deno.unstable.d.ts b/cli/dts/lib.deno.unstable.d.ts
index 8623e73d4..5007d657d 100644
--- a/cli/dts/lib.deno.unstable.d.ts
+++ b/cli/dts/lib.deno.unstable.d.ts
@@ -21,28 +21,6 @@ declare namespace Deno {
*/
export function umask(mask?: number): number;
- /** **UNSTABLE**: This API needs a security review.
- *
- * Synchronously creates `newpath` as a hard link to `oldpath`.
- *
- * ```ts
- * Deno.linkSync("old/name", "new/name");
- * ```
- *
- * Requires `allow-read` and `allow-write` permissions. */
- export function linkSync(oldpath: string, newpath: string): void;
-
- /** **UNSTABLE**: This API needs a security review.
- *
- * Creates `newpath` as a hard link to `oldpath`.
- *
- * ```ts
- * await Deno.link("old/name", "new/name");
- * ```
- *
- * Requires `allow-read` and `allow-write` permissions. */
- export function link(oldpath: string, newpath: string): Promise<void>;
-
/** **UNSTABLE**: New API, yet to be vetted.
*
* Gets the size of the console as columns/rows.
diff --git a/runtime/js/90_deno_ns.js b/runtime/js/90_deno_ns.js
index 84c6b7ade..bd56538d1 100644
--- a/runtime/js/90_deno_ns.js
+++ b/runtime/js/90_deno_ns.js
@@ -88,6 +88,8 @@
fsync: __bootstrap.fs.fsync,
fdatasyncSync: __bootstrap.fs.fdatasyncSync,
fdatasync: __bootstrap.fs.fdatasync,
+ link: __bootstrap.fs.link,
+ linkSync: __bootstrap.fs.linkSync,
permissions: __bootstrap.permissions.permissions,
Permissions: __bootstrap.permissions.Permissions,
PermissionStatus: __bootstrap.permissions.PermissionStatus,
@@ -122,8 +124,6 @@
ftruncateSync: __bootstrap.fs.ftruncateSync,
ftruncate: __bootstrap.fs.ftruncate,
umask: __bootstrap.fs.umask,
- link: __bootstrap.fs.link,
- linkSync: __bootstrap.fs.linkSync,
futime: __bootstrap.fs.futime,
futimeSync: __bootstrap.fs.futimeSync,
utime: __bootstrap.fs.utime,
diff --git a/runtime/ops/fs.rs b/runtime/ops/fs.rs
index 629afbfe6..5f5425dfa 100644
--- a/runtime/ops/fs.rs
+++ b/runtime/ops/fs.rs
@@ -1140,13 +1140,14 @@ fn op_link_sync(
args: Value,
_zero_copy: &mut [ZeroCopyBuf],
) -> Result<Value, AnyError> {
- super::check_unstable(state, "Deno.link");
let args: LinkArgs = serde_json::from_value(args)?;
let oldpath = PathBuf::from(&args.oldpath);
let newpath = PathBuf::from(&args.newpath);
let permissions = state.borrow::<Permissions>();
permissions.check_read(&oldpath)?;
+ permissions.check_write(&oldpath)?;
+ permissions.check_read(&newpath)?;
permissions.check_write(&newpath)?;
debug!("op_link_sync {} {}", oldpath.display(), newpath.display());
@@ -1159,8 +1160,6 @@ async fn op_link_async(
args: Value,
_zero_copy: BufVec,
) -> Result<Value, AnyError> {
- super::check_unstable2(&state, "Deno.link");
-
let args: LinkArgs = serde_json::from_value(args)?;
let oldpath = PathBuf::from(&args.oldpath);
let newpath = PathBuf::from(&args.newpath);
@@ -1169,6 +1168,8 @@ async fn op_link_async(
let state = state.borrow();
let permissions = state.borrow::<Permissions>();
permissions.check_read(&oldpath)?;
+ permissions.check_write(&oldpath)?;
+ permissions.check_read(&newpath)?;
permissions.check_write(&newpath)?;
}