From 3675ae918cf4e91b4fed9a237350c2c0f7a5d1aa Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Tue, 22 Dec 2020 01:22:14 -0800 Subject: [PATCH] Fix certain invalid page ranges causing exception Closes #686 --- src/ocrmypdf/_validation.py | 19 ++++++++++++++----- tests/test_page_numbers.py | 6 ++++++ 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/ocrmypdf/_validation.py b/src/ocrmypdf/_validation.py index 9354a629..a6ee9a08 100644 --- a/src/ocrmypdf/_validation.py +++ b/src/ocrmypdf/_validation.py @@ -13,7 +13,7 @@ import sys import unicodedata from pathlib import Path from shutil import copyfileobj -from typing import Tuple +from typing import List, Set, Tuple, Union import pikepdf import PIL @@ -136,10 +136,10 @@ def check_options_preprocessing(options): raise BadArgsError(str(e)) -def _pages_from_ranges(ranges): +def _pages_from_ranges(ranges: str) -> Set[int]: if is_iterable_notstr(ranges): return set(ranges) - pages = [] + pages: List[int] = [] page_groups = ranges.replace(' ', '').split(',') for g in page_groups: if not g: @@ -150,9 +150,18 @@ def _pages_from_ranges(ranges): pages.append(int(g) - 1) else: try: - pages.extend(range(int(start) - 1, int(end))) + new_pages = list(range(int(start) - 1, int(end))) + if not new_pages: + raise BadArgsError(f"invalid page subrange '{start}-{end}'") + pages.extend(new_pages) except ValueError: - raise BadArgsError("invalid page range") + raise BadArgsError("invalid page range") from None + + if not pages: + raise BadArgsError( + f"The string of page ranges '{ranges}' did not contain any recognizable " + f"page ranges." + ) if not monotonic(pages): log.warning( diff --git a/tests/test_page_numbers.py b/tests/test_page_numbers.py index 28f59416..71f06a0d 100644 --- a/tests/test_page_numbers.py +++ b/tests/test_page_numbers.py @@ -28,6 +28,12 @@ from ocrmypdf.pdfinfo import PdfInfo ['1,3,-11', BadArgsError], ['1-,', BadArgsError], ['start-end', BadArgsError], + ['1-0', BadArgsError], + ['99-98', BadArgsError], + ['0-0', BadArgsError], + ['1-0,3-4', BadArgsError], + [',', BadArgsError], + ['', BadArgsError], ], ) def test_pages(pages, result):