From 930ae17da1387d5f472f500303436441bd4f7253 Mon Sep 17 00:00:00 2001 From: brick30llc-ctrl Date: Sat, 11 Jul 2026 23:55:17 -0500 Subject: [PATCH 1/2] fix(sse): escape backslash in ChatGPT-web citation link text (#6569) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit markdownLinkText() escaped [ and ] but not the backslash itself, so a citation label ending in (or containing) a backslash produced a broken Markdown link — e.g. [Path C:\](url), where the trailing \ escapes the closing bracket and consumes the link. Escape the backslash first, then the brackets. Clears the CodeQL js/incomplete-sanitization alerts at open-sse/executors/chatgpt-web/citations.ts:52 (2 of the 9 new alerts on the v3.8.47 release PR). Regression guard: tests/unit/chatgpt-web-citations-escape.test.ts (trailing backslash, backslash-before-bracket, bracket-only, plain). --- open-sse/executors/chatgpt-web/citations.ts | 10 +++- .../unit/chatgpt-web-citations-escape.test.ts | 50 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 tests/unit/chatgpt-web-citations-escape.test.ts diff --git a/open-sse/executors/chatgpt-web/citations.ts b/open-sse/executors/chatgpt-web/citations.ts index 395a18317c0f..2f61830ad8a5 100644 --- a/open-sse/executors/chatgpt-web/citations.ts +++ b/open-sse/executors/chatgpt-web/citations.ts @@ -49,7 +49,15 @@ function asArray(value: unknown): unknown[] { } function markdownLinkText(value: string): string { - return value.replace(/\[/g, "\\[").replace(/\]/g, "\\]").replace(/\n/g, " ").trim(); + // Escape the backslash first — otherwise a label ending in (or containing) a + // backslash leaks past the `[…]` escaping and breaks the generated link, e.g. + // `[Path C:\](url)` where the trailing `\` escapes the closing bracket. + return value + .replace(/\\/g, "\\\\") + .replace(/\[/g, "\\[") + .replace(/\]/g, "\\]") + .replace(/\n/g, " ") + .trim(); } function markdownUrl(value: string): string { diff --git a/tests/unit/chatgpt-web-citations-escape.test.ts b/tests/unit/chatgpt-web-citations-escape.test.ts new file mode 100644 index 000000000000..540183e95915 --- /dev/null +++ b/tests/unit/chatgpt-web-citations-escape.test.ts @@ -0,0 +1,50 @@ +// ChatGPT-web citation link-text escaping (CodeQL js/incomplete-sanitization, +// PR #6569 release-blocker). +// +// `markdownLinkText()` builds the `[text]` half of a Markdown link from an +// untrusted citation label. It escaped `[` and `]` but NOT the backslash +// itself, so a label ending in (or containing) a backslash produced a broken +// link: e.g. `[Path C:\](url)` — the trailing `\` escapes the closing `]`, +// consuming the link's bracket. The escape character must be escaped first. + +import test from "node:test"; +import assert from "node:assert/strict"; + +const { cleanChatGptText } = await import( + "../../open-sse/executors/chatgpt-web/citations.ts" +); + +const S = ""; // marker start +const SEP = ""; // marker separator +const E = ""; // marker end + +// Build a raw `url` citation marker:  url 