From bd2ba0a6857ca5f807b75c603bec6e2c52cebdc5 Mon Sep 17 00:00:00 2001 From: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Date: Sat, 24 Oct 2026 18:13:42 -0500 Subject: [PATCH] fix(schema): validate base64 attachments in linear time (#58811) --- packages/schema/src/prompt.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/schema/src/prompt.ts b/packages/schema/src/prompt.ts index ba8a7a73079..0086ca11356 100644 --- a/packages/schema/src/prompt.ts +++ b/packages/schema/src/prompt.ts @@ -18,8 +18,12 @@ export const FileSource = Schema.Union([ .annotate({ identifier: "Prompt.FileSource" }) export type FileSource = typeof FileSource.Type +// The canonical pattern backtracks on large inputs, so it only supplies metadata (OpenAPI, errors) while an equivalent linear check runs. export const Base64 = Schema.String.check( - Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u), + Schema.makeFilter( + (value: string) => value.length % 4 === 0 && /^[A-Za-z0-9+/]*={0,2}$/u.test(value), + Schema.isPattern(/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u).annotations, + ), ).annotate({ identifier: "Prompt.Base64" }) export type Base64 = typeof Base64.Type