From 370cfbb36574551949cca9b622b41d3076543bb0 Mon Sep 17 00:00:00 2001 From: Aliaksandr Valialkin Date: Fri, 1 Nov 2019 16:11:15 +0200 Subject: [PATCH] lib/uint64set: return an emptry set instead of nil set from `Set.Clone`, since the caller may add data to the cloned set This fixes the following panic in v1.28.1: panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x783a7e] goroutine 1155 [running]: github.com/VictoriaMetrics/VictoriaMetrics/lib/uint64set.(*Set).Add(0x0, 0x15b3bfb41e8b71ec) github.com/VictoriaMetrics/VictoriaMetrics@/lib/uint64set/uint64set.go:57 +0x2e github.com/VictoriaMetrics/VictoriaMetrics/lib/storage.(*indexSearch).getMetricIDsForRecentHours(0xc5bdc0dd40, 0x16e273f6b50, 0x16e2745d3f0, 0x5b8d95, 0x10, 0x4a2f51, 0xaa01000000000000) github.com/VictoriaMetrics/VictoriaMetrics@/lib/storage/index_db.go:1951 +0x260 github.com/VictoriaMetrics/VictoriaMetrics/lib/storage.(*indexSearch).getMetricIDsForTimeRange(0xc5bdc0dd40, 0x16e273f6b50, 0x16e2745d3f0, 0x5b8d95, 0x10, 0xb296c0, 0xc00009cd80, 0x9bc640) --- lib/uint64set/uint64set.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/uint64set/uint64set.go b/lib/uint64set/uint64set.go index 5132c6e27a..54cc96b870 100644 --- a/lib/uint64set/uint64set.go +++ b/lib/uint64set/uint64set.go @@ -31,7 +31,8 @@ func (s *bucket32Sorter) Swap(i, j int) { // Clone returns an independent copy of s. func (s *Set) Clone() *Set { if s == nil { - return nil + // Return an empty set, so data could be added into it later. + return &Set{} } var dst Set dst.itemsCount = s.itemsCount