Skip to content

Commit

Permalink
Enforce permissions on kill(), homeDir() and execPath (denoland#2723)
Browse files Browse the repository at this point in the history
  • Loading branch information
nayeemrmn authored and ry committed Aug 6, 2019
1 parent 046cccf commit 11c850a
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 3 deletions.
4 changes: 3 additions & 1 deletion cli/ops.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1053,10 +1053,12 @@ fn op_close(
}

fn op_kill(
_state: &ThreadSafeState,
state: &ThreadSafeState,
base: &msg::Base<'_>,
data: Option<PinnedBuf>,
) -> CliOpResult {
state.check_run()?;

assert!(data.is_none());
let inner = base.inner_as_kill().unwrap();
let pid = inner.pid();
Expand Down
6 changes: 4 additions & 2 deletions js/os.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ export let pid: number;
/** Reflects the NO_COLOR environment variable: https://no-color.org/ */
export let noColor: boolean;

/** Path to the current deno process's executable file. */
/** Path to the current deno process's executable file.
* Requires the `--allow-env` flag, otherwise it'll be set to an empty `string`.
*/
export let execPath: string;

function setGlobals(pid_: number, noColor_: boolean, execPath_: string): void {
Expand Down Expand Up @@ -145,7 +147,7 @@ export function start(

/**
* Returns the current user's home directory.
* Does not require elevated privileges.
* Requires the `--allow-env` flag.
*/
export function homeDir(): string {
const builder = flatbuffers.createBuilder();
Expand Down
1 change: 1 addition & 0 deletions js/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ async function runStatus(rid: number): Promise<ProcessStatus> {
/** Send a signal to process under given PID. Unix only at this moment.
* If pid is negative, the signal will be sent to the process group identified
* by -pid.
* Requires the `--allow-run` flag.
*/
export function kill(pid: number, signo: number): void {
const builder = flatbuffers.createBuilder();
Expand Down
16 changes: 16 additions & 0 deletions js/process_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -321,6 +321,22 @@ test(function signalNumbers(): void {

// Ignore signal tests on windows for now...
if (Deno.platform.os !== "win") {
test(function killPermissions(): void {
let caughtError = false;
try {
// Unlike the other test cases, we don't have permission to spawn a
// subprocess we can safely kill. Instead we send SIGCONT to the current
// process - assuming that Deno does not have a special handler set for it
// and will just continue even if a signal is erroneously sent.
Deno.kill(Deno.pid, Deno.Signal.SIGCONT);
} catch (e) {
caughtError = true;
assertEquals(e.kind, Deno.ErrorKind.PermissionDenied);
assertEquals(e.name, "PermissionDenied");
}
assert(caughtError);
});

testPerm({ run: true }, async function killSuccess(): Promise<void> {
const p = run({
args: ["python", "-c", "from time import sleep; sleep(10000)"]
Expand Down

0 comments on commit 11c850a

Please sign in to comment.