Skip to content

Commit 08a9d67

Browse files
committed
fix(vnext): validate parser array lengths
1 parent 96bd2ce commit 08a9d67

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

src/vnext/__tests__/node-sql-parser-backend.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,32 @@ describe("node-sql-parser backend output decoding", () => {
569569
});
570570
});
571571

572+
it.each(["1", Number.NaN, -1, 1.5, Number.MAX_SAFE_INTEGER + 1])(
573+
"rejects an array with a spoofed length descriptor %#",
574+
async (length) => {
575+
const root = new Proxy([{ type: "select" }], {
576+
getOwnPropertyDescriptor(target, key) {
577+
if (key === "length") {
578+
return {
579+
configurable: false,
580+
enumerable: false,
581+
value: length,
582+
writable: true,
583+
};
584+
}
585+
return Reflect.getOwnPropertyDescriptor(target, key);
586+
},
587+
});
588+
const backend = backendFor(() => root);
589+
590+
await expect(backend.parse("SELECT 1")).resolves.toStrictEqual({
591+
code: "malformed-output",
592+
kind: "failed",
593+
retryable: false,
594+
});
595+
},
596+
);
597+
572598
it("does not invoke an accessor-backed root type", async () => {
573599
let invoked = false;
574600
const root = {};

src/vnext/node-sql-parser-backend.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,11 @@ function decodeRoot(
255255
}
256256
if (rootIsArray && isRecordObject(root)) {
257257
const length = readOwnDataProperty(root, "length");
258-
if (length.kind !== "value") {
258+
if (
259+
length.kind !== "value" ||
260+
!Number.isSafeInteger(length.value) ||
261+
Number(length.value) < 0
262+
) {
259263
return failed("malformed-output", false);
260264
}
261265
if (length.value !== 1) {

0 commit comments

Comments
 (0)