Skip to content

Commit e744ebb

Browse files
security: fix leaked kernel process context
1 parent 8d9df67 commit e744ebb

3 files changed

Lines changed: 15 additions & 5 deletions

File tree

src/kernel/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,16 +325,17 @@ export class Kernel {
325325
// provide either privileged or userspace kernel access
326326
if (start_privileged) {
327327
data.kernel = this;
328+
data.process = process;
328329
} else {
329330
data.kernel = this.create_userspace_proxy(process);
331+
data.process = process.create_userspace_proxy();
330332
}
331333

332334
data.term = this.#term;
333335
data.args = args;
334336
data.shell = shell;
335337
data.unsubbed_args = parsed_line.unsubbed_args;
336338
data.raw_parts = parsed_line.raw_parts;
337-
data.process = process;
338339

339340
Object.freeze(data);
340341

src/kernel/processes.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -309,8 +309,11 @@ export interface UserspaceOtherProcessContext {
309309
export interface UserspaceProcessContext extends UserspaceOtherProcessContext {
310310
detach(silently?: boolean): void;
311311
kill(exit_code?: number): void;
312+
add_exit_listener(listener: (exit_code: number) => Promise<void> | void): void;
312313
create_timeout(callback: () => void, delay: number): number;
313314
cancel_timeout(id: number): void;
315+
wait_for_timeout(id: number): Promise<boolean>;
316+
has_timeout(id: number): boolean;
314317
create_interval(callback: () => void, interval: number): number;
315318
clear_interval(id: number): void;
316319
create_window(): AbstractWindow | null;
@@ -434,7 +437,11 @@ export class ProcessContext {
434437
this.#manager.mark_terminated(this.#pid);
435438

436439
for (const listener of this.#exit_listeners) {
437-
listener(exit_code);
440+
try {
441+
listener(exit_code);
442+
} catch (err) {
443+
console.error("Process exit listener error:", err);
444+
}
438445
}
439446
}
440447

@@ -615,11 +622,13 @@ export class ProcessContext {
615622
is_foreground: { get: () => self.is_foreground, enumerable: true },
616623
attachment: { get: () => self.attachment, enumerable: true },
617624
source_command: { get: () => self.source_command, enumerable: true },
618-
619625
detach: { value: (silently = false) => { self.detach(silently); }, enumerable: true },
620626
kill: { value: (exit_code = 0) => { self.kill(exit_code); }, enumerable: true },
627+
add_exit_listener: { value: (listener: (exit_code: number) => Promise<void> | void) => { self.add_exit_listener(listener); }, enumerable: true },
621628
create_timeout: { value: (callback: () => void, delay: number) => self.create_timeout(callback, delay), enumerable: true },
622629
cancel_timeout: { value: (id: number) => { self.cancel_timeout(id); }, enumerable: true },
630+
wait_for_timeout: { value: (id: number) => self.wait_for_timeout(id), enumerable: true },
631+
has_timeout: { value: (id: number) => self.has_timeout(id), enumerable: true },
623632
create_interval: { value: (callback: () => void, interval: number) => self.create_interval(callback, interval), enumerable: true },
624633
clear_interval: { value: (id: number) => { self.clear_interval(id); }, enumerable: true },
625634
create_window: { value: () => self.create_window(), enumerable: true },

src/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type {Kernel, UserspaceKernel} from "./kernel";
22
import type {WrappedTerminal} from "./kernel/term_ctl";
3-
import type {ProcessContext} from "./kernel/processes";
3+
import type {ProcessContext, UserspaceProcessContext} from "./kernel/processes";
44
import type {AbstractShell} from "./abstract_shell";
55

66
export interface ProgramMainData<K = UserspaceKernel> {
@@ -19,7 +19,7 @@ export interface ProgramMainData<K = UserspaceKernel> {
1919
shell?: AbstractShell;
2020

2121
// process info for the currently running program
22-
process: ProcessContext,
22+
process: K extends Kernel ? ProcessContext : UserspaceProcessContext;
2323

2424
// args after variable substitution
2525
args: string[],

0 commit comments

Comments
 (0)