From d022d8dbb2b38ed666ede310662682d4d83774c3 Mon Sep 17 00:00:00 2001 From: Lee Sang Gyu Date: Wed, 4 Nov 2026 01:11:16 +0900 Subject: [PATCH 1/2] fix(cli): reject an open range missing its end instead of scanning zero targets Added error handling for missing range end in lenset parsing. --- user_scanner/core/patterns.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/user_scanner/core/patterns.py b/user_scanner/core/patterns.py index 065447c3e..5dbda591d 100644 --- a/user_scanner/core/patterns.py +++ b/user_scanner/core/patterns.py @@ -98,7 +98,12 @@ def _parse_lenset(lexer: Lexer) -> Set[int]: lexer.next() rhs = lexer.parse_number() - if lhs is not None and rhs is not None: + # "{2-}" consumed the dash but has no end: erroring matches + # "{-2}", while skipping silently expands to zero permutations + # and the scan runs on no targets without a word. + if rhs is None: + raise ValueError('Missing range end after "-" in lenset') + if lhs is not None: for i in range(lhs, rhs + 1): lenset.add(i) elif lhs is not None: From 37c16d703d8cbefc67f02813ad19be594e0a6acb Mon Sep 17 00:00:00 2001 From: Lee Sang Gyu Date: Wed, 4 Nov 2026 01:11:38 +0900 Subject: [PATCH 2/2] test(cli): cover open range missing its end in lenset Add test for error when open range is missing end. --- tests/test_patterns.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/test_patterns.py b/tests/test_patterns.py index 48ab530f9..9596159c7 100644 --- a/tests/test_patterns.py +++ b/tests/test_patterns.py @@ -186,6 +186,13 @@ def test_error_unclosed_brace(): list(expand_patterns("test[a]{1-3")) +def test_error_open_range_missing_end(): + """"{2-}" consumes the dash and finds no end: same error class as "{-2}", + not a silent expansion to zero permutations.""" + with pytest.raises(ValueError, match="range end"): + list(expand_patterns("test[a-c]{2-}")) + + def test_error_lone_open_bracket(): with pytest.raises(ValueError): list(expand_patterns("["))