common/collections: Always make a copy of the input slice in Append

Fixes #10458.
This commit is contained in:
Bjørn Erik Pedersen 2023-06-14 09:44:18 +02:00
parent d178fe94fe
commit f73c567534
2 changed files with 19 additions and 0 deletions

View file

@ -31,6 +31,13 @@ func Append(to any, from ...any) (any, error) {
var tot reflect.Type var tot reflect.Type
if !toIsNil { if !toIsNil {
if tov.Kind() == reflect.Slice {
// Create a copy of tov, so we don't modify the original.
c := reflect.MakeSlice(tov.Type(), tov.Len(), tov.Len()+len(from))
reflect.Copy(c, tov)
tov = c
}
if tov.Kind() != reflect.Slice { if tov.Kind() != reflect.Slice {
return nil, fmt.Errorf("expected a slice, got %T", to) return nil, fmt.Errorf("expected a slice, got %T", to)
} }

View file

@ -129,3 +129,15 @@ func TestAppendToMultiDimensionalSlice(t *testing.T) {
} }
} }
func TestAppendShouldMakeACopyOfTheInputSlice(t *testing.T) {
t.Parallel()
c := qt.New(t)
slice := make([]string, 0, 100)
slice = append(slice, "a", "b")
result, err := Append(slice, "c")
c.Assert(err, qt.IsNil)
slice[0] = "d"
c.Assert(result, qt.DeepEquals, []string{"a", "b", "c"})
c.Assert(slice, qt.DeepEquals, []string{"d", "b"})
}