From: Johan Abildskov Date: Wed, 22 Mar 2023 06:31:25 +0000 (+0000) Subject: encoding/gob: extend partially allocated string slices X-Git-Tag: go1.21rc1~1174 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3d5391ed87d813110e10b954c62bf7ed578b591f;p=gostls13.git encoding/gob: extend partially allocated string slices Fixes #59172 Change-Id: I54d5e724f10117a40ec5dd58c810f6bbb2475933 GitHub-Last-Rev: d1a986698c820415b2e0be12141091a3cbf6fde3 GitHub-Pull-Request: golang/go#59173 Reviewed-on: https://go-review.googlesource.com/c/go/+/478215 Run-TryBot: Ian Lance Taylor Reviewed-by: Rob Pike Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor TryBot-Result: Gopher Robot Auto-Submit: Ian Lance Taylor Reviewed-by: Heschi Kreinick --- diff --git a/src/encoding/gob/codec_test.go b/src/encoding/gob/codec_test.go index 54c356c464..28cd6088af 100644 --- a/src/encoding/gob/codec_test.go +++ b/src/encoding/gob/codec_test.go @@ -1544,6 +1544,10 @@ type LargeSliceStruct struct { S []StringPair } +type LargeSliceString struct { + S []string +} + func testEncodeDecode(t *testing.T, in, out any) { t.Helper() var b bytes.Buffer @@ -1592,4 +1596,14 @@ func TestLargeSlice(t *testing.T) { rt := &LargeSliceStruct{} testEncodeDecode(t, st, rt) }) + t.Run("string", func(t *testing.T) { + t.Parallel() + s := make([]string, 1<<21) + for i := range s { + s[i] = string(rune(i)) + } + st := &LargeSliceString{S: s} + rt := &LargeSliceString{} + testEncodeDecode(t, st, rt) + }) } diff --git a/src/encoding/gob/dec_helpers.go b/src/encoding/gob/dec_helpers.go index a09ac8fc1a..098ba7254a 100644 --- a/src/encoding/gob/dec_helpers.go +++ b/src/encoding/gob/dec_helpers.go @@ -358,6 +358,9 @@ func decStringSlice(state *decoderState, v reflect.Value, length int, ovfl error if state.b.Len() == 0 { errorf("decoding string array or slice: length exceeds input size (%d elements)", length) } + if i >= len(slice) { + growSlice(v, &slice, length) + } u := state.decodeUint() n := int(u) if n < 0 || uint64(n) != u || n > state.b.Len() {