diff --git a/promql/parser/parse.go b/promql/parser/parse.go index ea27a04d9e..b7962defc8 100644 --- a/promql/parser/parse.go +++ b/promql/parser/parse.go @@ -1115,6 +1115,11 @@ func (p *parser) evalDurationExprBinOp(lhs, rhs Node, op Item) *NumberLiteral { return &NumberLiteral{Val: 0} } + if val > 1<<63/1e9 || val < -(1<<63)/1e9 { + p.addParseErrf(op.PositionRange(), "duration out of range") + return &NumberLiteral{Val: 0} + } + return &NumberLiteral{ Val: val, PosRange: posrange.PositionRange{ diff --git a/promql/parser/parse_test.go b/promql/parser/parse_test.go index 09612c1130..a58dd1bf0d 100644 --- a/promql/parser/parse_test.go +++ b/promql/parser/parse_test.go @@ -4060,6 +4060,21 @@ var testExpr = []struct { fail: true, errMsg: `modulo by zero`, }, + { + input: `foo[150y+150y]`, + fail: true, + errMsg: `duration out of range`, + }, + { + input: `foo offset (150y+150y)`, + fail: true, + errMsg: `duration out of range`, + }, + { + input: `foo offset (-2*150y)`, + fail: true, + errMsg: `duration out of range`, + }, } func makeInt64Pointer(val int64) *int64 {