From 33801c32c47bfb360f9cc4e3c10f7b34d72fff14 Mon Sep 17 00:00:00 2001 From: Buqian Zheng Date: Fri, 12 Apr 2024 14:25:19 +0800 Subject: [PATCH] fix: in milvus check sparse index to be less than uint32 max (#32199) issue: #29419 Signed-off-by: Buqian Zheng --- pkg/util/typeutil/schema.go | 6 +++++- pkg/util/typeutil/schema_test.go | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pkg/util/typeutil/schema.go b/pkg/util/typeutil/schema.go index ef65bdbc63..c036f13aa5 100644 --- a/pkg/util/typeutil/schema.go +++ b/pkg/util/typeutil/schema.go @@ -1466,7 +1466,11 @@ func ValidateSparseFloatRows(rows ...[]byte) error { return fmt.Errorf("invalid data length in sparse float vector: %d", len(row)) } for i := 0; i < SparseFloatRowElementCount(row); i++ { - if i > 0 && SparseFloatRowIndexAt(row, i) < SparseFloatRowIndexAt(row, i-1) { + idx := SparseFloatRowIndexAt(row, i) + if idx == math.MaxUint32 { + return errors.New("invalid index in sparse float vector: must be less than 2^32-1") + } + if i > 0 && idx < SparseFloatRowIndexAt(row, i-1) { return errors.New("unsorted indices in sparse float vector") } VerifyFloat(float64(SparseFloatRowValueAt(row, i))) diff --git a/pkg/util/typeutil/schema_test.go b/pkg/util/typeutil/schema_test.go index 471b2944f2..093da91d7b 100644 --- a/pkg/util/typeutil/schema_test.go +++ b/pkg/util/typeutil/schema_test.go @@ -18,6 +18,7 @@ package typeutil import ( "encoding/binary" + "math" "reflect" "testing" @@ -2060,6 +2061,14 @@ func TestValidateSparseFloatRows(t *testing.T) { assert.Error(t, err) }) + t.Run("invalid index", func(t *testing.T) { + rows := [][]byte{ + testutils.CreateSparseFloatRow([]uint32{3, 5, math.MaxUint32}, []float32{1.0, 2.0, 3.0}), + } + err := ValidateSparseFloatRows(rows...) + assert.Error(t, err) + }) + t.Run("empty indices or values", func(t *testing.T) { rows := [][]byte{ testutils.CreateSparseFloatRow([]uint32{}, []float32{}),