Skip to content

Commit 677b083

Browse files
committed
Ensure remote backend command requests are only executed once
Fixes microsoft#121926
1 parent 4ec47f2 commit 677b083

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

src/vs/server/node/remoteTerminalChannel.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export class RemoteTerminalChannel extends Disposable implements IServerChannel<
8989
uriTransformer: IURITransformer;
9090
}>();
9191

92-
private readonly _onExecuteCommand = this._register(new Emitter<{ reqId: number; commandId: string; commandArgs: any[] }>());
92+
private readonly _onExecuteCommand = this._register(new Emitter<{ reqId: number; persistentProcessId: number; commandId: string; commandArgs: any[] }>());
9393
readonly onExecuteCommand = this._onExecuteCommand.event;
9494

9595
constructor(
@@ -240,21 +240,21 @@ export class RemoteTerminalChannel extends Disposable implements IServerChannel<
240240
// Setup the CLI server to support forwarding commands run from the CLI
241241
const ipcHandlePath = createRandomIPCHandle();
242242
env.VSCODE_IPC_HOOK_CLI = ipcHandlePath;
243+
244+
const persistentProcessId = await this._ptyService.createProcess(shellLaunchConfig, initialCwd, args.cols, args.rows, args.unicodeVersion, env, baseEnv, args.options, args.shouldPersistTerminal, args.workspaceId, args.workspaceName);
243245
const commandsExecuter: ICommandsExecuter = {
244-
executeCommand: <T>(id: string, ...args: any[]): Promise<T> => this._executeCommand(id, args, uriTransformer)
246+
executeCommand: <T>(id: string, ...args: any[]): Promise<T> => this._executeCommand(persistentProcessId, id, args, uriTransformer)
245247
};
246248
const cliServer = new CLIServerBase(commandsExecuter, this._logService, ipcHandlePath);
247-
248-
const id = await this._ptyService.createProcess(shellLaunchConfig, initialCwd, args.cols, args.rows, args.unicodeVersion, env, baseEnv, args.options, args.shouldPersistTerminal, args.workspaceId, args.workspaceName);
249-
this._ptyService.onProcessExit(e => e.id === id && cliServer.dispose());
249+
this._ptyService.onProcessExit(e => e.id === persistentProcessId && cliServer.dispose());
250250

251251
return {
252-
persistentTerminalId: id,
252+
persistentTerminalId: persistentProcessId,
253253
resolvedShellLaunchConfig: shellLaunchConfig
254254
};
255255
}
256256

257-
private _executeCommand<T>(commandId: string, commandArgs: any[], uriTransformer: IURITransformer): Promise<T> {
257+
private _executeCommand<T>(persistentProcessId: number, commandId: string, commandArgs: any[], uriTransformer: IURITransformer): Promise<T> {
258258
let resolve!: (data: any) => void;
259259
let reject!: (err: any) => void;
260260
const result = new Promise<T>((_resolve, _reject) => {
@@ -277,6 +277,7 @@ export class RemoteTerminalChannel extends Disposable implements IServerChannel<
277277
});
278278
this._onExecuteCommand.fire({
279279
reqId,
280+
persistentProcessId,
280281
commandId,
281282
commandArgs: serializedCommandArgs
282283
});

src/vs/workbench/contrib/terminal/browser/remoteTerminalBackend.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ class RemoteTerminalBackend extends BaseTerminalBackend implements ITerminalBack
9292

9393
const allowedCommands = ['_remoteCLI.openExternal', '_remoteCLI.windowOpen', '_remoteCLI.getSystemStatus', '_remoteCLI.manageExtensions'];
9494
this._remoteTerminalChannel.onExecuteCommand(async e => {
95+
// Ensure this request for for this window
96+
const pty = this._ptys.get(e.persistentProcessId);
97+
if (!pty) {
98+
return;
99+
}
95100
const reqId = e.reqId;
96101
const commandId = e.commandId;
97102
if (!allowedCommands.includes(commandId)) {

src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ export class RemoteTerminalChannelClient implements IPtyHostController {
8888
get onProcessOrphanQuestion(): Event<{ id: number }> {
8989
return this._channel.listen<{ id: number }>('$onProcessOrphanQuestion');
9090
}
91-
get onExecuteCommand(): Event<{ reqId: number; commandId: string; commandArgs: any[] }> {
92-
return this._channel.listen<{ reqId: number; commandId: string; commandArgs: any[] }>('$onExecuteCommand');
91+
get onExecuteCommand(): Event<{ reqId: number; persistentProcessId: number; commandId: string; commandArgs: any[] }> {
92+
return this._channel.listen<{ reqId: number; persistentProcessId: number; commandId: string; commandArgs: any[] }>('$onExecuteCommand');
9393
}
9494
get onDidRequestDetach(): Event<{ requestId: number; workspaceId: string; instanceId: number }> {
9595
return this._channel.listen<{ requestId: number; workspaceId: string; instanceId: number }>('$onDidRequestDetach');

0 commit comments

Comments
 (0)