Skip to content

Commit 3cdaceb

Browse files
committed
fix: enforce maximum of 1024 items in range expressions
Range expressions like '1-1025' were accepted despite exceeding the spec limit of 1024 items. Add validation in IntRangeExpr._validate() to reject range expressions that produce more than 1024 values. Signed-off-by: Stephen Crowe <6042774+crowecawcaw@users.noreply.github.com>
1 parent 428227a commit 3cdaceb

File tree

2 files changed

+28
-0
lines changed

2 files changed

+28
-0
lines changed

src/openjd/model/_range_expr.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ def ranges(self) -> list[IntRange]:
150150

151151
def _validate(self) -> None:
152152
"""raises: ValueError - if not valid"""
153+
if len(self) > 1024:
154+
raise ValueError(
155+
f"Range expression produces {len(self)} values, but the maximum is 1024."
156+
)
153157
# Validate that the ranges are not overlapping
154158
prev_range: IntRange | None = None
155159
for range_ in self.ranges:

test/openjd/model/_internal/test_range_expr.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,30 @@ def test_contains(self) -> None:
362362
assert -3 not in IntRangeExpr.from_str("-1--2:-1")
363363
assert 0 not in IntRangeExpr.from_str("-1--2:-1")
364364

365+
def test_range_expr_max_1024_items_succeeds(self):
366+
expr = IntRangeExpr.from_str("1-1024")
367+
assert len(expr) == 1024
368+
369+
def test_range_expr_1025_items_fails(self):
370+
with pytest.raises(ExpressionError):
371+
IntRangeExpr.from_str("1-1025")
372+
373+
def test_range_expr_combined_subranges_exceed_1024_fails(self):
374+
with pytest.raises(ExpressionError):
375+
IntRangeExpr.from_str("1-600,700-1300")
376+
377+
def test_range_expr_stepped_within_limit_succeeds(self):
378+
expr = IntRangeExpr.from_str("1-2047:2")
379+
assert len(expr) == 1024
380+
381+
def test_range_expr_stepped_exceeds_limit_fails(self):
382+
with pytest.raises(ExpressionError):
383+
IntRangeExpr.from_str("1-3000:2")
384+
385+
def test_range_expr_negative_range_exceeds_limit_fails(self):
386+
with pytest.raises(ExpressionError):
387+
IntRangeExpr.from_str("-512-512")
388+
365389

366390
class TestIntRange:
367391
def test_length(self):

0 commit comments

Comments
 (0)