From 3b2922cfbbefc55f7c5c533306d6aa9d128a93cd Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Tue, 21 Apr 2026 01:09:17 +0700 Subject: [PATCH] fix(export): harden edited-track filter validation --- electron/ipc/nativeVideoExport.test.ts | 9 +++++++++ electron/ipc/nativeVideoExport.ts | 9 +++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/electron/ipc/nativeVideoExport.test.ts b/electron/ipc/nativeVideoExport.test.ts index eefbad03..aa213073 100644 --- a/electron/ipc/nativeVideoExport.test.ts +++ b/electron/ipc/nativeVideoExport.test.ts @@ -54,5 +54,14 @@ describe("buildEditedTrackSourceAudioFilter", () => { expect( buildEditedTrackSourceAudioFilter([{ startMs: 0, endMs: 2_000, speed: 1 }], 0.4), ).toBeNull(); + expect( + buildEditedTrackSourceAudioFilter([{ startMs: -100, endMs: 2_000, speed: 1 }], 44_100), + ).toBeNull(); + expect( + buildEditedTrackSourceAudioFilter( + [{ startMs: 0, endMs: 2_000, speed: Number.MAX_SAFE_INTEGER }], + 44_100, + ), + ).toBeNull(); }); }); diff --git a/electron/ipc/nativeVideoExport.ts b/electron/ipc/nativeVideoExport.ts index 0f59eddf..5ca8fa08 100644 --- a/electron/ipc/nativeVideoExport.ts +++ b/electron/ipc/nativeVideoExport.ts @@ -190,7 +190,12 @@ export function buildEditedTrackSourceAudioFilter( let hasInvalidSegment = false; segments.forEach((segment, index) => { - if (!Number.isFinite(segment.startMs) || !Number.isFinite(segment.endMs)) { + if ( + !Number.isFinite(segment.startMs) || + !Number.isFinite(segment.endMs) || + segment.startMs < 0 || + segment.endMs < 0 + ) { hasInvalidSegment = true; return; } @@ -214,7 +219,7 @@ export function buildEditedTrackSourceAudioFilter( if (Math.abs(speed - 1) > 0.0001) { const adjustedSampleRate = Math.round(normalizedSourceSampleRate * speed); - if (adjustedSampleRate < 1) { + if (!Number.isSafeInteger(adjustedSampleRate) || adjustedSampleRate < 1) { hasInvalidSegment = true; return; }