diff --git a/model/labels/labels_dedupelabels.go b/model/labels/labels_dedupelabels.go index db6c56b33..2306d38d1 100644 --- a/model/labels/labels_dedupelabels.go +++ b/model/labels/labels_dedupelabels.go @@ -81,10 +81,10 @@ func (t *SymbolTable) toNumUnlocked(name string) int { } i := t.nextNum if t.nextNum == cap(t.byNum) { - // Name table is full; copy to a new one. Don't touch the existing slice. - oldSlice := t.byNum - t.nameTable = &nameTable{byNum: make([]string, cap(oldSlice)*2), symbolTable: t} - copy(t.nameTable.byNum, oldSlice) + // Name table is full; copy to a new one. Don't touch the existing slice, as nameTable is immutable after construction. + newSlice := make([]string, cap(t.byNum)*2) + copy(newSlice, t.byNum) + t.nameTable = &nameTable{byNum: newSlice, symbolTable: t} } name = strings.Clone(name) t.byNum[i] = name @@ -112,18 +112,18 @@ func decodeVarint(data string, index int) (int, int) { if b < 0x80 { return int(b), index } - size := int(b & 0x7F) + value := int(b & 0x7F) for shift := uint(7); ; shift += 7 { // Just panic if we go of the end of data, since all Labels strings are constructed internally and // malformed data indicates a bug, or memory corruption. b := data[index] index++ - size |= int(b&0x7F) << shift + value |= int(b&0x7F) << shift if b < 0x80 { break } } - return size, index + return value, index } func decodeString(t *nameTable, data string, index int) (string, int) { @@ -304,8 +304,7 @@ func (ls Labels) BytesWithoutLabels(buf []byte, names ...string) []byte { // Copy returns a copy of the labels. func (ls Labels) Copy() Labels { - buf := append([]byte{}, ls.data...) - return Labels{syms: ls.syms, data: yoloString(buf)} + return Labels{syms: ls.syms, data: strings.Clone(ls.data)} } // Get returns the value for the label with the given name.