From c34f38c2a5431aac2d31dd3ba044fda44f74014c Mon Sep 17 00:00:00 2001 From: cmliu Date: Fri, 31 Jul 2026 22:16:35 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=99=90=E5=88=B6=E8=BF=9B=E7=A8=8B?= =?UTF-8?q?=E7=BB=88=E6=AD=A2=E8=BE=93=E5=87=BA=E7=9A=84=E7=BC=93=E5=86=B2?= =?UTF-8?q?=E5=8C=BA=E5=A4=A7=E5=B0=8F=EF=BC=8C=E9=98=B2=E6=AD=A2=E8=BF=87?= =?UTF-8?q?=E5=A4=A7=E6=95=B0=E6=8D=AE=E5=AF=BC=E8=87=B4=E5=86=85=E5=AD=98?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/session.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/backend/session.ts b/src/backend/session.ts index 8aa2bb6..da6d978 100644 --- a/src/backend/session.ts +++ b/src/backend/session.ts @@ -1037,20 +1037,19 @@ export class SSHSession { private appendKillOutput(kill: PendingProcessKillChannel, output: Uint8Array, isStderr: boolean): void { if (kill.finalized) return; - const text = (isStderr ? kill.stderrDecoder : kill.stdoutDecoder).decode(output, { stream: true }); + const maxRemaining = PROCESS_KILL_MAX_BUFFER_BYTES - (isStderr ? kill.stderrBytes : kill.stdoutBytes); + if (maxRemaining <= 0) return; + // Limit input before decoding to prevent large transient string allocations + // from oversized SSH DATA / EXTENDED_DATA frames. + const input = output.length > maxRemaining ? output.subarray(0, maxRemaining) : output; + const text = (isStderr ? kill.stderrDecoder : kill.stdoutDecoder).decode(input, { stream: true }); if (!text) return; if (isStderr) { - const remaining = PROCESS_KILL_MAX_BUFFER_BYTES - kill.stderrBytes; - if (remaining <= 0) return; - const slice = text.length > remaining ? text.slice(0, remaining) : text; - kill.stderr += slice; - kill.stderrBytes += slice.length; + kill.stderr += text; + kill.stderrBytes += input.length; } else { - const remaining = PROCESS_KILL_MAX_BUFFER_BYTES - kill.stdoutBytes; - if (remaining <= 0) return; - const slice = text.length > remaining ? text.slice(0, remaining) : text; - kill.stdout += slice; - kill.stdoutBytes += slice.length; + kill.stdout += text; + kill.stdoutBytes += input.length; } }