summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKohei Ueno <k.cola119@ezweb.ne.jp>2021-02-23 18:24:59 +0900
committerGitHub <noreply@github.com>2021-02-23 04:24:59 -0500
commit2e3d72064af3013116a7555c049511097eb4e801 (patch)
tree8e6a7a20b85142e071ff7e525af5222fd199c6d4
parent8be0c8b43a56ee690463efb3e68686f0fefa868b (diff)
fix: panic caused by Deno.env.set("", "") (#9583)
-rw-r--r--cli/tests/unit/os_test.ts15
-rw-r--r--runtime/ops/os.rs14
2 files changed, 28 insertions, 1 deletions
diff --git a/cli/tests/unit/os_test.ts b/cli/tests/unit/os_test.ts
index 9a2d33f53..5786ad32e 100644
--- a/cli/tests/unit/os_test.ts
+++ b/cli/tests/unit/os_test.ts
@@ -27,6 +27,21 @@ unitTest({ perms: { env: true } }, function deleteEnv(): void {
assertEquals(Deno.env.get("TEST_VAR"), undefined);
});
+unitTest({ perms: { env: true } }, function avoidEmptyNamedEnv(): void {
+ assertThrows(() => Deno.env.set("", "v"), TypeError);
+ assertThrows(() => Deno.env.set("a=a", "v"), TypeError);
+ assertThrows(() => Deno.env.set("a\0a", "v"), TypeError);
+ assertThrows(() => Deno.env.set("TEST_VAR", "v\0v"), TypeError);
+
+ assertThrows(() => Deno.env.get(""), TypeError);
+ assertThrows(() => Deno.env.get("a=a"), TypeError);
+ assertThrows(() => Deno.env.get("a\0a"), TypeError);
+
+ assertThrows(() => Deno.env.delete(""), TypeError);
+ assertThrows(() => Deno.env.delete("a=a"), TypeError);
+ assertThrows(() => Deno.env.delete("a\0a"), TypeError);
+});
+
unitTest(function envPermissionDenied1(): void {
assertThrows(() => {
Deno.env.toObject();
diff --git a/runtime/ops/os.rs b/runtime/ops/os.rs
index 0183ffe5f..10e0c8bc1 100644
--- a/runtime/ops/os.rs
+++ b/runtime/ops/os.rs
@@ -1,7 +1,7 @@
// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
use crate::permissions::Permissions;
-use deno_core::error::AnyError;
+use deno_core::error::{type_error, AnyError};
use deno_core::serde_json;
use deno_core::serde_json::json;
use deno_core::serde_json::Value;
@@ -55,6 +55,12 @@ fn op_set_env(
) -> Result<Value, AnyError> {
let args: SetEnv = serde_json::from_value(args)?;
state.borrow::<Permissions>().check_env()?;
+ let invalid_key =
+ args.key.is_empty() || args.key.contains(&['=', '\0'] as &[char]);
+ let invalid_value = args.value.contains('\0');
+ if invalid_key || invalid_value {
+ return Err(type_error("Key or value contains invalid characters."));
+ }
env::set_var(args.key, args.value);
Ok(json!({}))
}
@@ -81,6 +87,9 @@ fn op_get_env(
) -> Result<Value, AnyError> {
let args: GetEnv = serde_json::from_value(args)?;
state.borrow::<Permissions>().check_env()?;
+ if args.key.is_empty() || args.key.contains(&['=', '\0'] as &[char]) {
+ return Err(type_error("Key contains invalid characters."));
+ }
let r = match env::var(args.key) {
Err(env::VarError::NotPresent) => json!([]),
v => json!([v?]),
@@ -100,6 +109,9 @@ fn op_delete_env(
) -> Result<Value, AnyError> {
let args: DeleteEnv = serde_json::from_value(args)?;
state.borrow::<Permissions>().check_env()?;
+ if args.key.is_empty() || args.key.contains(&['=', '\0'] as &[char]) {
+ return Err(type_error("Key contains invalid characters."));
+ }
env::remove_var(args.key);
Ok(json!({}))
}