From 9cfd6f7df87c1ed412554d6d38c08519d31bc921 Mon Sep 17 00:00:00 2001 From: Julien Pivotto <291750+roidelapluie@users.noreply.github.com> Date: Mon, 24 Mar 2025 12:08:06 +0100 Subject: [PATCH] PromQL duration expr: Add a check for durations our of range Signed-off-by: Julien Pivotto <291750+roidelapluie@users.noreply.github.com> --- promql/parser/parse.go | 5 +++++ promql/parser/parse_test.go | 15 +++++++++++++++ 2 files changed, 20 insertions(+) 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 {