From 341e2524b97e02755382b165b1bdf2af16d6815b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Mar 2026 03:20:37 +0000 Subject: [PATCH] Fix array slice out-of-bounds panic with very negative indices Agent-Logs-Url: https://github.com/mikefarah/yq/sessions/7c146762-d251-45fd-8555-2488f59fc57b Co-authored-by: mikefarah <1151925+mikefarah@users.noreply.github.com> --- pkg/yqlib/operator_slice.go | 11 +++++++++++ pkg/yqlib/operator_slice_test.go | 16 ++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/pkg/yqlib/operator_slice.go b/pkg/yqlib/operator_slice.go index 24d1629d..e54a7918 100644 --- a/pkg/yqlib/operator_slice.go +++ b/pkg/yqlib/operator_slice.go @@ -80,13 +80,24 @@ func sliceArrayOperator(d *dataTreeNavigator, context Context, expressionNode *E if relativeFirstNumber < 0 { relativeFirstNumber = len(lhsNode.Content) + firstNumber } + if relativeFirstNumber < 0 { + relativeFirstNumber = 0 + } else if relativeFirstNumber > len(lhsNode.Content) { + relativeFirstNumber = len(lhsNode.Content) + } relativeSecondNumber := secondNumber if relativeSecondNumber < 0 { relativeSecondNumber = len(lhsNode.Content) + secondNumber + } + if relativeSecondNumber < 0 { + relativeSecondNumber = 0 } else if relativeSecondNumber > len(lhsNode.Content) { relativeSecondNumber = len(lhsNode.Content) } + if relativeSecondNumber < relativeFirstNumber { + relativeSecondNumber = relativeFirstNumber + } log.Debugf("calculateIndicesToTraverse: slice from %v to %v", relativeFirstNumber, relativeSecondNumber) diff --git a/pkg/yqlib/operator_slice_test.go b/pkg/yqlib/operator_slice_test.go index c4a6b783..33ce462f 100644 --- a/pkg/yqlib/operator_slice_test.go +++ b/pkg/yqlib/operator_slice_test.go @@ -98,6 +98,22 @@ var sliceArrayScenarios = []expressionScenario{ "D0, P[], (!!seq)::- cat1\n", }, }, + { + skipDoc: true, + document: `[cat, dog, frog]`, + expression: `.[-100:]`, + expected: []string{ + "D0, P[], (!!seq)::- cat\n- dog\n- frog\n", + }, + }, + { + skipDoc: true, + document: `[cat, dog, frog]`, + expression: `.[:-100]`, + expected: []string{ + "D0, P[], (!!seq)::[]\n", + }, + }, { description: "Slicing strings", document: `country: Australia`,