Skip to content

Commit f3233b1

Browse files
committed
fix(pdf): validate page selections before loading
1 parent 500cc98 commit f3233b1

3 files changed

Lines changed: 14 additions & 9 deletions

File tree

src/agents/tools/pdf-tool.helpers.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,10 @@ export function parsePageRange(range: string, maxPages: number): number[] {
6565
pages.add(i);
6666
}
6767
} else {
68-
const pageMatch = /^\d+$/.exec(part);
69-
const num = pageMatch ? Number(pageMatch[0]) : Number.NaN;
68+
if (!/^\d+$/.test(part)) {
69+
throw new Error(`Invalid page number: "${part}"`);
70+
}
71+
const num = Number(part);
7072
if (!Number.isFinite(num) || num < 1) {
7173
throw new Error(`Invalid page number: "${part}"`);
7274
}

src/agents/tools/pdf-tool.test.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -568,11 +568,14 @@ describe("createPdfTool", () => {
568568
});
569569
});
570570

571-
it.each(["1.5", "1,2.5"])(
572-
"rejects fractional page selection %s before fallback extraction",
573-
async (pages) => {
571+
it.each([
572+
["1.5", "1.5"],
573+
["1,2.5", "2.5"],
574+
])(
575+
"rejects fractional page selection %s before loading or fallback extraction",
576+
async (pages, invalidPage) => {
574577
await withTempPdfAgentDir(async (agentDir) => {
575-
await stubPdfToolInfra(agentDir, {
578+
const { loadSpy } = await stubPdfToolInfra(agentDir, {
576579
provider: "openai",
577580
api: "openai-responses",
578581
input: ["text"],
@@ -590,7 +593,8 @@ describe("createPdfTool", () => {
590593
pdf: "/tmp/doc.pdf",
591594
pages,
592595
}),
593-
).rejects.toThrow(`Invalid page number: "${pages.includes(",") ? "2.5" : pages}"`);
596+
).rejects.toThrow(`Invalid page number: "${invalidPage}"`);
597+
expect(loadSpy).not.toHaveBeenCalled();
594598
expect(extractSpy).not.toHaveBeenCalled();
595599
expect(completeMock).not.toHaveBeenCalled();
596600
});

src/agents/tools/pdf-tool.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ export function createPdfTool(options?: {
374374

375375
// Parse page range
376376
const pagesRaw = normalizeOptionalString(record.pages);
377+
const pageNumbers = pagesRaw ? parsePageRange(pagesRaw, configuredMaxPages) : undefined;
377378
const password = typeof record.password === "string" ? record.password : undefined;
378379

379380
const pdfModelConfig =
@@ -495,8 +496,6 @@ export function createPdfTool(options?: {
495496
});
496497
}
497498

498-
const pageNumbers = pagesRaw ? parsePageRange(pagesRaw, configuredMaxPages) : undefined;
499-
500499
const getExtractions = async (): Promise<PdfExtractedContent[]> => {
501500
const extractedAll: PdfExtractedContent[] = [];
502501
for (const pdf of loadedPdfs) {

0 commit comments

Comments
 (0)