From debbed79416b0502001cd6ba4e480648a26fa7a7 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Tue, 24 Mar 2026 01:06:27 +0100 Subject: [PATCH] Handle invalid RPC escape sequences --- apps/indexer/src/rpc.ts | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/apps/indexer/src/rpc.ts b/apps/indexer/src/rpc.ts index 17df081..e615160 100644 --- a/apps/indexer/src/rpc.ts +++ b/apps/indexer/src/rpc.ts @@ -12,6 +12,7 @@ function escapeControlCharactersInStrings(payload: string): string { let result = ""; let inString = false; let escaping = false; + let unicodeDigitsRemaining = 0; for (let index = 0; index < payload.length; index += 1) { const char = payload[index]; @@ -25,7 +26,41 @@ function escapeControlCharactersInStrings(payload: string): string { } if (escaping) { - result += char; + if (unicodeDigitsRemaining > 0) { + if (/^[0-9a-fA-F]$/.test(char)) { + result += char; + unicodeDigitsRemaining -= 1; + if (unicodeDigitsRemaining === 0) { + escaping = false; + } + continue; + } + + result += "\\u"; + result += "0".repeat(unicodeDigitsRemaining); + unicodeDigitsRemaining = 0; + escaping = false; + } + + if (char === "\"" || char === "\\" || char === "/" || char === "b" || char === "f" || char === "n" || char === "r" || char === "t") { + result += char; + escaping = false; + continue; + } + + if (char === "u") { + result += char; + unicodeDigitsRemaining = 4; + continue; + } + + result += "\\\\"; + const code = char.charCodeAt(0); + if (code <= 0x1f) { + result += `u${code.toString(16).padStart(4, "0")}`; + } else { + result += char; + } escaping = false; continue; }