1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5//go:generate go run decgen.go -output dec_helpers.go
6
7package gob
8
9import (
10	"encoding"
11	"errors"
12	"internal/saferio"
13	"io"
14	"math"
15	"math/bits"
16	"reflect"
17)
18
19var (
20	errBadUint = errors.New("gob: encoded unsigned integer out of range")
21	errBadType = errors.New("gob: unknown type id or corrupted data")
22	errRange   = errors.New("gob: bad data: field numbers out of bounds")
23)
24
25type decHelper func(state *decoderState, v reflect.Value, length int, ovfl error) bool
26
27// decoderState is the execution state of an instance of the decoder. A new state
28// is created for nested objects.
29type decoderState struct {
30	dec *Decoder
31	// The buffer is stored with an extra indirection because it may be replaced
32	// if we load a type during decode (when reading an interface value).
33	b        *decBuffer
34	fieldnum int           // the last field number read.
35	next     *decoderState // for free list
36}
37
38// decBuffer is an extremely simple, fast implementation of a read-only byte buffer.
39// It is initialized by calling Size and then copying the data into the slice returned by Bytes().
40type decBuffer struct {
41	data   []byte
42	offset int // Read offset.
43}
44
45func (d *decBuffer) Read(p []byte) (int, error) {
46	n := copy(p, d.data[d.offset:])
47	if n == 0 && len(p) != 0 {
48		return 0, io.EOF
49	}
50	d.offset += n
51	return n, nil
52}
53
54func (d *decBuffer) Drop(n int) {
55	if n > d.Len() {
56		panic("drop")
57	}
58	d.offset += n
59}
60
61func (d *decBuffer) ReadByte() (byte, error) {
62	if d.offset >= len(d.data) {
63		return 0, io.EOF
64	}
65	c := d.data[d.offset]
66	d.offset++
67	return c, nil
68}
69
70func (d *decBuffer) Len() int {
71	return len(d.data) - d.offset
72}
73
74func (d *decBuffer) Bytes() []byte {
75	return d.data[d.offset:]
76}
77
78// SetBytes sets the buffer to the bytes, discarding any existing data.
79func (d *decBuffer) SetBytes(data []byte) {
80	d.data = data
81	d.offset = 0
82}
83
84func (d *decBuffer) Reset() {
85	d.data = d.data[0:0]
86	d.offset = 0
87}
88
89// We pass the bytes.Buffer separately for easier testing of the infrastructure
90// without requiring a full Decoder.
91func (dec *Decoder) newDecoderState(buf *decBuffer) *decoderState {
92	d := dec.freeList
93	if d == nil {
94		d = new(decoderState)
95		d.dec = dec
96	} else {
97		dec.freeList = d.next
98	}
99	d.b = buf
100	return d
101}
102
103func (dec *Decoder) freeDecoderState(d *decoderState) {
104	d.next = dec.freeList
105	dec.freeList = d
106}
107
108func overflow(name string) error {
109	return errors.New(`value for "` + name + `" out of range`)
110}
111
112// decodeUintReader reads an encoded unsigned integer from an io.Reader.
113// Used only by the Decoder to read the message length.
114func decodeUintReader(r io.Reader, buf []byte) (x uint64, width int, err error) {
115	width = 1
116	n, err := io.ReadFull(r, buf[0:width])
117	if n == 0 {
118		return
119	}
120	b := buf[0]
121	if b <= 0x7f {
122		return uint64(b), width, nil
123	}
124	n = -int(int8(b))
125	if n > uint64Size {
126		err = errBadUint
127		return
128	}
129	width, err = io.ReadFull(r, buf[0:n])
130	if err != nil {
131		if err == io.EOF {
132			err = io.ErrUnexpectedEOF
133		}
134		return
135	}
136	// Could check that the high byte is zero but it's not worth it.
137	for _, b := range buf[0:width] {
138		x = x<<8 | uint64(b)
139	}
140	width++ // +1 for length byte
141	return
142}
143
144// decodeUint reads an encoded unsigned integer from state.r.
145// Does not check for overflow.
146func (state *decoderState) decodeUint() (x uint64) {
147	b, err := state.b.ReadByte()
148	if err != nil {
149		error_(err)
150	}
151	if b <= 0x7f {
152		return uint64(b)
153	}
154	n := -int(int8(b))
155	if n > uint64Size {
156		error_(errBadUint)
157	}
158	buf := state.b.Bytes()
159	if len(buf) < n {
160		errorf("invalid uint data length %d: exceeds input size %d", n, len(buf))
161	}
162	// Don't need to check error; it's safe to loop regardless.
163	// Could check that the high byte is zero but it's not worth it.
164	for _, b := range buf[0:n] {
165		x = x<<8 | uint64(b)
166	}
167	state.b.Drop(n)
168	return x
169}
170
171// decodeInt reads an encoded signed integer from state.r.
172// Does not check for overflow.
173func (state *decoderState) decodeInt() int64 {
174	x := state.decodeUint()
175	if x&1 != 0 {
176		return ^int64(x >> 1)
177	}
178	return int64(x >> 1)
179}
180
181// getLength decodes the next uint and makes sure it is a possible
182// size for a data item that follows, which means it must fit in a
183// non-negative int and fit in the buffer.
184func (state *decoderState) getLength() (int, bool) {
185	n := int(state.decodeUint())
186	if n < 0 || state.b.Len() < n || tooBig <= n {
187		return 0, false
188	}
189	return n, true
190}
191
192// decOp is the signature of a decoding operator for a given type.
193type decOp func(i *decInstr, state *decoderState, v reflect.Value)
194
195// The 'instructions' of the decoding machine
196type decInstr struct {
197	op    decOp
198	field int   // field number of the wire type
199	index []int // field access indices for destination type
200	ovfl  error // error message for overflow/underflow (for arrays, of the elements)
201}
202
203// ignoreUint discards a uint value with no destination.
204func ignoreUint(i *decInstr, state *decoderState, v reflect.Value) {
205	state.decodeUint()
206}
207
208// ignoreTwoUints discards a uint value with no destination. It's used to skip
209// complex values.
210func ignoreTwoUints(i *decInstr, state *decoderState, v reflect.Value) {
211	state.decodeUint()
212	state.decodeUint()
213}
214
215// Since the encoder writes no zeros, if we arrive at a decoder we have
216// a value to extract and store. The field number has already been read
217// (it's how we knew to call this decoder).
218// Each decoder is responsible for handling any indirections associated
219// with the data structure. If any pointer so reached is nil, allocation must
220// be done.
221
222// decAlloc takes a value and returns a settable value that can
223// be assigned to. If the value is a pointer, decAlloc guarantees it points to storage.
224// The callers to the individual decoders are expected to have used decAlloc.
225// The individual decoders don't need it.
226func decAlloc(v reflect.Value) reflect.Value {
227	for v.Kind() == reflect.Pointer {
228		if v.IsNil() {
229			v.Set(reflect.New(v.Type().Elem()))
230		}
231		v = v.Elem()
232	}
233	return v
234}
235
236// decBool decodes a uint and stores it as a boolean in value.
237func decBool(i *decInstr, state *decoderState, value reflect.Value) {
238	value.SetBool(state.decodeUint() != 0)
239}
240
241// decInt8 decodes an integer and stores it as an int8 in value.
242func decInt8(i *decInstr, state *decoderState, value reflect.Value) {
243	v := state.decodeInt()
244	if v < math.MinInt8 || math.MaxInt8 < v {
245		error_(i.ovfl)
246	}
247	value.SetInt(v)
248}
249
250// decUint8 decodes an unsigned integer and stores it as a uint8 in value.
251func decUint8(i *decInstr, state *decoderState, value reflect.Value) {
252	v := state.decodeUint()
253	if math.MaxUint8 < v {
254		error_(i.ovfl)
255	}
256	value.SetUint(v)
257}
258
259// decInt16 decodes an integer and stores it as an int16 in value.
260func decInt16(i *decInstr, state *decoderState, value reflect.Value) {
261	v := state.decodeInt()
262	if v < math.MinInt16 || math.MaxInt16 < v {
263		error_(i.ovfl)
264	}
265	value.SetInt(v)
266}
267
268// decUint16 decodes an unsigned integer and stores it as a uint16 in value.
269func decUint16(i *decInstr, state *decoderState, value reflect.Value) {
270	v := state.decodeUint()
271	if math.MaxUint16 < v {
272		error_(i.ovfl)
273	}
274	value.SetUint(v)
275}
276
277// decInt32 decodes an integer and stores it as an int32 in value.
278func decInt32(i *decInstr, state *decoderState, value reflect.Value) {
279	v := state.decodeInt()
280	if v < math.MinInt32 || math.MaxInt32 < v {
281		error_(i.ovfl)
282	}
283	value.SetInt(v)
284}
285
286// decUint32 decodes an unsigned integer and stores it as a uint32 in value.
287func decUint32(i *decInstr, state *decoderState, value reflect.Value) {
288	v := state.decodeUint()
289	if math.MaxUint32 < v {
290		error_(i.ovfl)
291	}
292	value.SetUint(v)
293}
294
295// decInt64 decodes an integer and stores it as an int64 in value.
296func decInt64(i *decInstr, state *decoderState, value reflect.Value) {
297	v := state.decodeInt()
298	value.SetInt(v)
299}
300
301// decUint64 decodes an unsigned integer and stores it as a uint64 in value.
302func decUint64(i *decInstr, state *decoderState, value reflect.Value) {
303	v := state.decodeUint()
304	value.SetUint(v)
305}
306
307// Floating-point numbers are transmitted as uint64s holding the bits
308// of the underlying representation. They are sent byte-reversed, with
309// the exponent end coming out first, so integer floating point numbers
310// (for example) transmit more compactly. This routine does the
311// unswizzling.
312func float64FromBits(u uint64) float64 {
313	v := bits.ReverseBytes64(u)
314	return math.Float64frombits(v)
315}
316
317// float32FromBits decodes an unsigned integer, treats it as a 32-bit floating-point
318// number, and returns it. It's a helper function for float32 and complex64.
319// It returns a float64 because that's what reflection needs, but its return
320// value is known to be accurately representable in a float32.
321func float32FromBits(u uint64, ovfl error) float64 {
322	v := float64FromBits(u)
323	av := v
324	if av < 0 {
325		av = -av
326	}
327	// +Inf is OK in both 32- and 64-bit floats. Underflow is always OK.
328	if math.MaxFloat32 < av && av <= math.MaxFloat64 {
329		error_(ovfl)
330	}
331	return v
332}
333
334// decFloat32 decodes an unsigned integer, treats it as a 32-bit floating-point
335// number, and stores it in value.
336func decFloat32(i *decInstr, state *decoderState, value reflect.Value) {
337	value.SetFloat(float32FromBits(state.decodeUint(), i.ovfl))
338}
339
340// decFloat64 decodes an unsigned integer, treats it as a 64-bit floating-point
341// number, and stores it in value.
342func decFloat64(i *decInstr, state *decoderState, value reflect.Value) {
343	value.SetFloat(float64FromBits(state.decodeUint()))
344}
345
346// decComplex64 decodes a pair of unsigned integers, treats them as a
347// pair of floating point numbers, and stores them as a complex64 in value.
348// The real part comes first.
349func decComplex64(i *decInstr, state *decoderState, value reflect.Value) {
350	real := float32FromBits(state.decodeUint(), i.ovfl)
351	imag := float32FromBits(state.decodeUint(), i.ovfl)
352	value.SetComplex(complex(real, imag))
353}
354
355// decComplex128 decodes a pair of unsigned integers, treats them as a
356// pair of floating point numbers, and stores them as a complex128 in value.
357// The real part comes first.
358func decComplex128(i *decInstr, state *decoderState, value reflect.Value) {
359	real := float64FromBits(state.decodeUint())
360	imag := float64FromBits(state.decodeUint())
361	value.SetComplex(complex(real, imag))
362}
363
364// decUint8Slice decodes a byte slice and stores in value a slice header
365// describing the data.
366// uint8 slices are encoded as an unsigned count followed by the raw bytes.
367func decUint8Slice(i *decInstr, state *decoderState, value reflect.Value) {
368	n, ok := state.getLength()
369	if !ok {
370		errorf("bad %s slice length: %d", value.Type(), n)
371	}
372	if value.Cap() < n {
373		safe := saferio.SliceCap[byte](uint64(n))
374		if safe < 0 {
375			errorf("%s slice too big: %d elements", value.Type(), n)
376		}
377		value.Set(reflect.MakeSlice(value.Type(), safe, safe))
378		ln := safe
379		i := 0
380		for i < n {
381			if i >= ln {
382				// We didn't allocate the entire slice,
383				// due to using saferio.SliceCap.
384				// Grow the slice for one more element.
385				// The slice is full, so this should
386				// bump up the capacity.
387				value.Grow(1)
388			}
389			// Copy into s up to the capacity or n,
390			// whichever is less.
391			ln = value.Cap()
392			if ln > n {
393				ln = n
394			}
395			value.SetLen(ln)
396			sub := value.Slice(i, ln)
397			if _, err := state.b.Read(sub.Bytes()); err != nil {
398				errorf("error decoding []byte at %d: %s", i, err)
399			}
400			i = ln
401		}
402	} else {
403		value.SetLen(n)
404		if _, err := state.b.Read(value.Bytes()); err != nil {
405			errorf("error decoding []byte: %s", err)
406		}
407	}
408}
409
410// decString decodes byte array and stores in value a string header
411// describing the data.
412// Strings are encoded as an unsigned count followed by the raw bytes.
413func decString(i *decInstr, state *decoderState, value reflect.Value) {
414	n, ok := state.getLength()
415	if !ok {
416		errorf("bad %s slice length: %d", value.Type(), n)
417	}
418	// Read the data.
419	data := state.b.Bytes()
420	if len(data) < n {
421		errorf("invalid string length %d: exceeds input size %d", n, len(data))
422	}
423	s := string(data[:n])
424	state.b.Drop(n)
425	value.SetString(s)
426}
427
428// ignoreUint8Array skips over the data for a byte slice value with no destination.
429func ignoreUint8Array(i *decInstr, state *decoderState, value reflect.Value) {
430	n, ok := state.getLength()
431	if !ok {
432		errorf("slice length too large")
433	}
434	bn := state.b.Len()
435	if bn < n {
436		errorf("invalid slice length %d: exceeds input size %d", n, bn)
437	}
438	state.b.Drop(n)
439}
440
441// Execution engine
442
443// The encoder engine is an array of instructions indexed by field number of the incoming
444// decoder. It is executed with random access according to field number.
445type decEngine struct {
446	instr    []decInstr
447	numInstr int // the number of active instructions
448}
449
450// decodeSingle decodes a top-level value that is not a struct and stores it in value.
451// Such values are preceded by a zero, making them have the memory layout of a
452// struct field (although with an illegal field number).
453func (dec *Decoder) decodeSingle(engine *decEngine, value reflect.Value) {
454	state := dec.newDecoderState(&dec.buf)
455	defer dec.freeDecoderState(state)
456	state.fieldnum = singletonField
457	if state.decodeUint() != 0 {
458		errorf("decode: corrupted data: non-zero delta for singleton")
459	}
460	instr := &engine.instr[singletonField]
461	instr.op(instr, state, value)
462}
463
464// decodeStruct decodes a top-level struct and stores it in value.
465// Indir is for the value, not the type. At the time of the call it may
466// differ from ut.indir, which was computed when the engine was built.
467// This state cannot arise for decodeSingle, which is called directly
468// from the user's value, not from the innards of an engine.
469func (dec *Decoder) decodeStruct(engine *decEngine, value reflect.Value) {
470	state := dec.newDecoderState(&dec.buf)
471	defer dec.freeDecoderState(state)
472	state.fieldnum = -1
473	for state.b.Len() > 0 {
474		delta := int(state.decodeUint())
475		if delta < 0 {
476			errorf("decode: corrupted data: negative delta")
477		}
478		if delta == 0 { // struct terminator is zero delta fieldnum
479			break
480		}
481		if state.fieldnum >= len(engine.instr)-delta { // subtract to compare without overflow
482			error_(errRange)
483		}
484		fieldnum := state.fieldnum + delta
485		instr := &engine.instr[fieldnum]
486		var field reflect.Value
487		if instr.index != nil {
488			// Otherwise the field is unknown to us and instr.op is an ignore op.
489			field = value.FieldByIndex(instr.index)
490			if field.Kind() == reflect.Pointer {
491				field = decAlloc(field)
492			}
493		}
494		instr.op(instr, state, field)
495		state.fieldnum = fieldnum
496	}
497}
498
499var noValue reflect.Value
500
501// ignoreStruct discards the data for a struct with no destination.
502func (dec *Decoder) ignoreStruct(engine *decEngine) {
503	state := dec.newDecoderState(&dec.buf)
504	defer dec.freeDecoderState(state)
505	state.fieldnum = -1
506	for state.b.Len() > 0 {
507		delta := int(state.decodeUint())
508		if delta < 0 {
509			errorf("ignore decode: corrupted data: negative delta")
510		}
511		if delta == 0 { // struct terminator is zero delta fieldnum
512			break
513		}
514		fieldnum := state.fieldnum + delta
515		if fieldnum >= len(engine.instr) {
516			error_(errRange)
517		}
518		instr := &engine.instr[fieldnum]
519		instr.op(instr, state, noValue)
520		state.fieldnum = fieldnum
521	}
522}
523
524// ignoreSingle discards the data for a top-level non-struct value with no
525// destination. It's used when calling Decode with a nil value.
526func (dec *Decoder) ignoreSingle(engine *decEngine) {
527	state := dec.newDecoderState(&dec.buf)
528	defer dec.freeDecoderState(state)
529	state.fieldnum = singletonField
530	delta := int(state.decodeUint())
531	if delta != 0 {
532		errorf("decode: corrupted data: non-zero delta for singleton")
533	}
534	instr := &engine.instr[singletonField]
535	instr.op(instr, state, noValue)
536}
537
538// decodeArrayHelper does the work for decoding arrays and slices.
539func (dec *Decoder) decodeArrayHelper(state *decoderState, value reflect.Value, elemOp decOp, length int, ovfl error, helper decHelper) {
540	if helper != nil && helper(state, value, length, ovfl) {
541		return
542	}
543	instr := &decInstr{elemOp, 0, nil, ovfl}
544	isPtr := value.Type().Elem().Kind() == reflect.Pointer
545	ln := value.Len()
546	for i := 0; i < length; i++ {
547		if state.b.Len() == 0 {
548			errorf("decoding array or slice: length exceeds input size (%d elements)", length)
549		}
550		if i >= ln {
551			// This is a slice that we only partially allocated.
552			// Grow it up to length.
553			value.Grow(1)
554			cp := value.Cap()
555			if cp > length {
556				cp = length
557			}
558			value.SetLen(cp)
559			ln = cp
560		}
561		v := value.Index(i)
562		if isPtr {
563			v = decAlloc(v)
564		}
565		elemOp(instr, state, v)
566	}
567}
568
569// decodeArray decodes an array and stores it in value.
570// The length is an unsigned integer preceding the elements. Even though the length is redundant
571// (it's part of the type), it's a useful check and is included in the encoding.
572func (dec *Decoder) decodeArray(state *decoderState, value reflect.Value, elemOp decOp, length int, ovfl error, helper decHelper) {
573	if n := state.decodeUint(); n != uint64(length) {
574		errorf("length mismatch in decodeArray")
575	}
576	dec.decodeArrayHelper(state, value, elemOp, length, ovfl, helper)
577}
578
579// decodeIntoValue is a helper for map decoding.
580func decodeIntoValue(state *decoderState, op decOp, isPtr bool, value reflect.Value, instr *decInstr) reflect.Value {
581	v := value
582	if isPtr {
583		v = decAlloc(value)
584	}
585
586	op(instr, state, v)
587	return value
588}
589
590// decodeMap decodes a map and stores it in value.
591// Maps are encoded as a length followed by key:value pairs.
592// Because the internals of maps are not visible to us, we must
593// use reflection rather than pointer magic.
594func (dec *Decoder) decodeMap(mtyp reflect.Type, state *decoderState, value reflect.Value, keyOp, elemOp decOp, ovfl error) {
595	n := int(state.decodeUint())
596	if value.IsNil() {
597		value.Set(reflect.MakeMapWithSize(mtyp, n))
598	}
599	keyIsPtr := mtyp.Key().Kind() == reflect.Pointer
600	elemIsPtr := mtyp.Elem().Kind() == reflect.Pointer
601	keyInstr := &decInstr{keyOp, 0, nil, ovfl}
602	elemInstr := &decInstr{elemOp, 0, nil, ovfl}
603	keyP := reflect.New(mtyp.Key())
604	elemP := reflect.New(mtyp.Elem())
605	for i := 0; i < n; i++ {
606		key := decodeIntoValue(state, keyOp, keyIsPtr, keyP.Elem(), keyInstr)
607		elem := decodeIntoValue(state, elemOp, elemIsPtr, elemP.Elem(), elemInstr)
608		value.SetMapIndex(key, elem)
609		keyP.Elem().SetZero()
610		elemP.Elem().SetZero()
611	}
612}
613
614// ignoreArrayHelper does the work for discarding arrays and slices.
615func (dec *Decoder) ignoreArrayHelper(state *decoderState, elemOp decOp, length int) {
616	instr := &decInstr{elemOp, 0, nil, errors.New("no error")}
617	for i := 0; i < length; i++ {
618		if state.b.Len() == 0 {
619			errorf("decoding array or slice: length exceeds input size (%d elements)", length)
620		}
621		elemOp(instr, state, noValue)
622	}
623}
624
625// ignoreArray discards the data for an array value with no destination.
626func (dec *Decoder) ignoreArray(state *decoderState, elemOp decOp, length int) {
627	if n := state.decodeUint(); n != uint64(length) {
628		errorf("length mismatch in ignoreArray")
629	}
630	dec.ignoreArrayHelper(state, elemOp, length)
631}
632
633// ignoreMap discards the data for a map value with no destination.
634func (dec *Decoder) ignoreMap(state *decoderState, keyOp, elemOp decOp) {
635	n := int(state.decodeUint())
636	keyInstr := &decInstr{keyOp, 0, nil, errors.New("no error")}
637	elemInstr := &decInstr{elemOp, 0, nil, errors.New("no error")}
638	for i := 0; i < n; i++ {
639		keyOp(keyInstr, state, noValue)
640		elemOp(elemInstr, state, noValue)
641	}
642}
643
644// decodeSlice decodes a slice and stores it in value.
645// Slices are encoded as an unsigned length followed by the elements.
646func (dec *Decoder) decodeSlice(state *decoderState, value reflect.Value, elemOp decOp, ovfl error, helper decHelper) {
647	u := state.decodeUint()
648	typ := value.Type()
649	size := uint64(typ.Elem().Size())
650	nBytes := u * size
651	n := int(u)
652	// Take care with overflow in this calculation.
653	if n < 0 || uint64(n) != u || nBytes > tooBig || (size > 0 && nBytes/size != u) {
654		// We don't check n against buffer length here because if it's a slice
655		// of interfaces, there will be buffer reloads.
656		errorf("%s slice too big: %d elements of %d bytes", typ.Elem(), u, size)
657	}
658	if value.Cap() < n {
659		safe := saferio.SliceCapWithSize(size, uint64(n))
660		if safe < 0 {
661			errorf("%s slice too big: %d elements of %d bytes", typ.Elem(), u, size)
662		}
663		value.Set(reflect.MakeSlice(typ, safe, safe))
664	} else {
665		value.SetLen(n)
666	}
667	dec.decodeArrayHelper(state, value, elemOp, n, ovfl, helper)
668}
669
670// ignoreSlice skips over the data for a slice value with no destination.
671func (dec *Decoder) ignoreSlice(state *decoderState, elemOp decOp) {
672	dec.ignoreArrayHelper(state, elemOp, int(state.decodeUint()))
673}
674
675// decodeInterface decodes an interface value and stores it in value.
676// Interfaces are encoded as the name of a concrete type followed by a value.
677// If the name is empty, the value is nil and no value is sent.
678func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, value reflect.Value) {
679	// Read the name of the concrete type.
680	nr := state.decodeUint()
681	if nr > 1<<31 { // zero is permissible for anonymous types
682		errorf("invalid type name length %d", nr)
683	}
684	if nr > uint64(state.b.Len()) {
685		errorf("invalid type name length %d: exceeds input size", nr)
686	}
687	n := int(nr)
688	name := state.b.Bytes()[:n]
689	state.b.Drop(n)
690	// Allocate the destination interface value.
691	if len(name) == 0 {
692		// Copy the nil interface value to the target.
693		value.SetZero()
694		return
695	}
696	if len(name) > 1024 {
697		errorf("name too long (%d bytes): %.20q...", len(name), name)
698	}
699	// The concrete type must be registered.
700	typi, ok := nameToConcreteType.Load(string(name))
701	if !ok {
702		errorf("name not registered for interface: %q", name)
703	}
704	typ := typi.(reflect.Type)
705
706	// Read the type id of the concrete value.
707	concreteId := dec.decodeTypeSequence(true)
708	if concreteId < 0 {
709		error_(dec.err)
710	}
711	// Byte count of value is next; we don't care what it is (it's there
712	// in case we want to ignore the value by skipping it completely).
713	state.decodeUint()
714	// Read the concrete value.
715	v := allocValue(typ)
716	dec.decodeValue(concreteId, v)
717	if dec.err != nil {
718		error_(dec.err)
719	}
720	// Assign the concrete value to the interface.
721	// Tread carefully; it might not satisfy the interface.
722	if !typ.AssignableTo(ityp) {
723		errorf("%s is not assignable to type %s", typ, ityp)
724	}
725	// Copy the interface value to the target.
726	value.Set(v)
727}
728
729// ignoreInterface discards the data for an interface value with no destination.
730func (dec *Decoder) ignoreInterface(state *decoderState) {
731	// Read the name of the concrete type.
732	n, ok := state.getLength()
733	if !ok {
734		errorf("bad interface encoding: name too large for buffer")
735	}
736	bn := state.b.Len()
737	if bn < n {
738		errorf("invalid interface value length %d: exceeds input size %d", n, bn)
739	}
740	state.b.Drop(n)
741	id := dec.decodeTypeSequence(true)
742	if id < 0 {
743		error_(dec.err)
744	}
745	// At this point, the decoder buffer contains a delimited value. Just toss it.
746	n, ok = state.getLength()
747	if !ok {
748		errorf("bad interface encoding: data length too large for buffer")
749	}
750	state.b.Drop(n)
751}
752
753// decodeGobDecoder decodes something implementing the GobDecoder interface.
754// The data is encoded as a byte slice.
755func (dec *Decoder) decodeGobDecoder(ut *userTypeInfo, state *decoderState, value reflect.Value) {
756	// Read the bytes for the value.
757	n, ok := state.getLength()
758	if !ok {
759		errorf("GobDecoder: length too large for buffer")
760	}
761	b := state.b.Bytes()
762	if len(b) < n {
763		errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, len(b))
764	}
765	b = b[:n]
766	state.b.Drop(n)
767	var err error
768	// We know it's one of these.
769	switch ut.externalDec {
770	case xGob:
771		err = value.Interface().(GobDecoder).GobDecode(b)
772	case xBinary:
773		err = value.Interface().(encoding.BinaryUnmarshaler).UnmarshalBinary(b)
774	case xText:
775		err = value.Interface().(encoding.TextUnmarshaler).UnmarshalText(b)
776	}
777	if err != nil {
778		error_(err)
779	}
780}
781
782// ignoreGobDecoder discards the data for a GobDecoder value with no destination.
783func (dec *Decoder) ignoreGobDecoder(state *decoderState) {
784	// Read the bytes for the value.
785	n, ok := state.getLength()
786	if !ok {
787		errorf("GobDecoder: length too large for buffer")
788	}
789	bn := state.b.Len()
790	if bn < n {
791		errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, bn)
792	}
793	state.b.Drop(n)
794}
795
796// Index by Go types.
797var decOpTable = [...]decOp{
798	reflect.Bool:       decBool,
799	reflect.Int8:       decInt8,
800	reflect.Int16:      decInt16,
801	reflect.Int32:      decInt32,
802	reflect.Int64:      decInt64,
803	reflect.Uint8:      decUint8,
804	reflect.Uint16:     decUint16,
805	reflect.Uint32:     decUint32,
806	reflect.Uint64:     decUint64,
807	reflect.Float32:    decFloat32,
808	reflect.Float64:    decFloat64,
809	reflect.Complex64:  decComplex64,
810	reflect.Complex128: decComplex128,
811	reflect.String:     decString,
812}
813
814// Indexed by gob types.  tComplex will be added during type.init().
815var decIgnoreOpMap = map[typeId]decOp{
816	tBool:    ignoreUint,
817	tInt:     ignoreUint,
818	tUint:    ignoreUint,
819	tFloat:   ignoreUint,
820	tBytes:   ignoreUint8Array,
821	tString:  ignoreUint8Array,
822	tComplex: ignoreTwoUints,
823}
824
825// decOpFor returns the decoding op for the base type under rt and
826// the indirection count to reach it.
827func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string, inProgress map[reflect.Type]*decOp) *decOp {
828	ut := userType(rt)
829	// If the type implements GobEncoder, we handle it without further processing.
830	if ut.externalDec != 0 {
831		return dec.gobDecodeOpFor(ut)
832	}
833
834	// If this type is already in progress, it's a recursive type (e.g. map[string]*T).
835	// Return the pointer to the op we're already building.
836	if opPtr := inProgress[rt]; opPtr != nil {
837		return opPtr
838	}
839	typ := ut.base
840	var op decOp
841	k := typ.Kind()
842	if int(k) < len(decOpTable) {
843		op = decOpTable[k]
844	}
845	if op == nil {
846		inProgress[rt] = &op
847		// Special cases
848		switch t := typ; t.Kind() {
849		case reflect.Array:
850			name = "element of " + name
851			elemId := dec.wireType[wireId].ArrayT.Elem
852			elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
853			ovfl := overflow(name)
854			helper := decArrayHelper[t.Elem().Kind()]
855			op = func(i *decInstr, state *decoderState, value reflect.Value) {
856				state.dec.decodeArray(state, value, *elemOp, t.Len(), ovfl, helper)
857			}
858
859		case reflect.Map:
860			keyId := dec.wireType[wireId].MapT.Key
861			elemId := dec.wireType[wireId].MapT.Elem
862			keyOp := dec.decOpFor(keyId, t.Key(), "key of "+name, inProgress)
863			elemOp := dec.decOpFor(elemId, t.Elem(), "element of "+name, inProgress)
864			ovfl := overflow(name)
865			op = func(i *decInstr, state *decoderState, value reflect.Value) {
866				state.dec.decodeMap(t, state, value, *keyOp, *elemOp, ovfl)
867			}
868
869		case reflect.Slice:
870			name = "element of " + name
871			if t.Elem().Kind() == reflect.Uint8 {
872				op = decUint8Slice
873				break
874			}
875			var elemId typeId
876			if tt := builtinIdToType(wireId); tt != nil {
877				elemId = tt.(*sliceType).Elem
878			} else {
879				elemId = dec.wireType[wireId].SliceT.Elem
880			}
881			elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
882			ovfl := overflow(name)
883			helper := decSliceHelper[t.Elem().Kind()]
884			op = func(i *decInstr, state *decoderState, value reflect.Value) {
885				state.dec.decodeSlice(state, value, *elemOp, ovfl, helper)
886			}
887
888		case reflect.Struct:
889			// Generate a closure that calls out to the engine for the nested type.
890			ut := userType(typ)
891			enginePtr, err := dec.getDecEnginePtr(wireId, ut)
892			if err != nil {
893				error_(err)
894			}
895			op = func(i *decInstr, state *decoderState, value reflect.Value) {
896				// indirect through enginePtr to delay evaluation for recursive structs.
897				dec.decodeStruct(*enginePtr, value)
898			}
899		case reflect.Interface:
900			op = func(i *decInstr, state *decoderState, value reflect.Value) {
901				state.dec.decodeInterface(t, state, value)
902			}
903		}
904	}
905	if op == nil {
906		errorf("decode can't handle type %s", rt)
907	}
908	return &op
909}
910
911var maxIgnoreNestingDepth = 10000
912
913// decIgnoreOpFor returns the decoding op for a field that has no destination.
914func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) *decOp {
915	// Track how deep we've recursed trying to skip nested ignored fields.
916	dec.ignoreDepth++
917	defer func() { dec.ignoreDepth-- }()
918	if dec.ignoreDepth > maxIgnoreNestingDepth {
919		error_(errors.New("invalid nesting depth"))
920	}
921	// If this type is already in progress, it's a recursive type (e.g. map[string]*T).
922	// Return the pointer to the op we're already building.
923	if opPtr := inProgress[wireId]; opPtr != nil {
924		return opPtr
925	}
926	op, ok := decIgnoreOpMap[wireId]
927	if !ok {
928		inProgress[wireId] = &op
929		if wireId == tInterface {
930			// Special case because it's a method: the ignored item might
931			// define types and we need to record their state in the decoder.
932			op = func(i *decInstr, state *decoderState, value reflect.Value) {
933				state.dec.ignoreInterface(state)
934			}
935			return &op
936		}
937		// Special cases
938		wire := dec.wireType[wireId]
939		switch {
940		case wire == nil:
941			errorf("bad data: undefined type %s", wireId.string())
942		case wire.ArrayT != nil:
943			elemId := wire.ArrayT.Elem
944			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
945			op = func(i *decInstr, state *decoderState, value reflect.Value) {
946				state.dec.ignoreArray(state, *elemOp, wire.ArrayT.Len)
947			}
948
949		case wire.MapT != nil:
950			keyId := dec.wireType[wireId].MapT.Key
951			elemId := dec.wireType[wireId].MapT.Elem
952			keyOp := dec.decIgnoreOpFor(keyId, inProgress)
953			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
954			op = func(i *decInstr, state *decoderState, value reflect.Value) {
955				state.dec.ignoreMap(state, *keyOp, *elemOp)
956			}
957
958		case wire.SliceT != nil:
959			elemId := wire.SliceT.Elem
960			elemOp := dec.decIgnoreOpFor(elemId, inProgress)
961			op = func(i *decInstr, state *decoderState, value reflect.Value) {
962				state.dec.ignoreSlice(state, *elemOp)
963			}
964
965		case wire.StructT != nil:
966			// Generate a closure that calls out to the engine for the nested type.
967			enginePtr, err := dec.getIgnoreEnginePtr(wireId)
968			if err != nil {
969				error_(err)
970			}
971			op = func(i *decInstr, state *decoderState, value reflect.Value) {
972				// indirect through enginePtr to delay evaluation for recursive structs
973				state.dec.ignoreStruct(*enginePtr)
974			}
975
976		case wire.GobEncoderT != nil, wire.BinaryMarshalerT != nil, wire.TextMarshalerT != nil:
977			op = func(i *decInstr, state *decoderState, value reflect.Value) {
978				state.dec.ignoreGobDecoder(state)
979			}
980		}
981	}
982	if op == nil {
983		errorf("bad data: ignore can't handle type %s", wireId.string())
984	}
985	return &op
986}
987
988// gobDecodeOpFor returns the op for a type that is known to implement
989// GobDecoder.
990func (dec *Decoder) gobDecodeOpFor(ut *userTypeInfo) *decOp {
991	rcvrType := ut.user
992	if ut.decIndir == -1 {
993		rcvrType = reflect.PointerTo(rcvrType)
994	} else if ut.decIndir > 0 {
995		for i := int8(0); i < ut.decIndir; i++ {
996			rcvrType = rcvrType.Elem()
997		}
998	}
999	var op decOp
1000	op = func(i *decInstr, state *decoderState, value reflect.Value) {
1001		// We now have the base type. We need its address if the receiver is a pointer.
1002		if value.Kind() != reflect.Pointer && rcvrType.Kind() == reflect.Pointer {
1003			value = value.Addr()
1004		}
1005		state.dec.decodeGobDecoder(ut, state, value)
1006	}
1007	return &op
1008}
1009
1010// compatibleType asks: Are these two gob Types compatible?
1011// Answers the question for basic types, arrays, maps and slices, plus
1012// GobEncoder/Decoder pairs.
1013// Structs are considered ok; fields will be checked later.
1014func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId, inProgress map[reflect.Type]typeId) bool {
1015	if rhs, ok := inProgress[fr]; ok {
1016		return rhs == fw
1017	}
1018	inProgress[fr] = fw
1019	ut := userType(fr)
1020	wire, ok := dec.wireType[fw]
1021	// If wire was encoded with an encoding method, fr must have that method.
1022	// And if not, it must not.
1023	// At most one of the booleans in ut is set.
1024	// We could possibly relax this constraint in the future in order to
1025	// choose the decoding method using the data in the wireType.
1026	// The parentheses look odd but are correct.
1027	if (ut.externalDec == xGob) != (ok && wire.GobEncoderT != nil) ||
1028		(ut.externalDec == xBinary) != (ok && wire.BinaryMarshalerT != nil) ||
1029		(ut.externalDec == xText) != (ok && wire.TextMarshalerT != nil) {
1030		return false
1031	}
1032	if ut.externalDec != 0 { // This test trumps all others.
1033		return true
1034	}
1035	switch t := ut.base; t.Kind() {
1036	default:
1037		// chan, etc: cannot handle.
1038		return false
1039	case reflect.Bool:
1040		return fw == tBool
1041	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
1042		return fw == tInt
1043	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
1044		return fw == tUint
1045	case reflect.Float32, reflect.Float64:
1046		return fw == tFloat
1047	case reflect.Complex64, reflect.Complex128:
1048		return fw == tComplex
1049	case reflect.String:
1050		return fw == tString
1051	case reflect.Interface:
1052		return fw == tInterface
1053	case reflect.Array:
1054		if !ok || wire.ArrayT == nil {
1055			return false
1056		}
1057		array := wire.ArrayT
1058		return t.Len() == array.Len && dec.compatibleType(t.Elem(), array.Elem, inProgress)
1059	case reflect.Map:
1060		if !ok || wire.MapT == nil {
1061			return false
1062		}
1063		MapType := wire.MapT
1064		return dec.compatibleType(t.Key(), MapType.Key, inProgress) && dec.compatibleType(t.Elem(), MapType.Elem, inProgress)
1065	case reflect.Slice:
1066		// Is it an array of bytes?
1067		if t.Elem().Kind() == reflect.Uint8 {
1068			return fw == tBytes
1069		}
1070		// Extract and compare element types.
1071		var sw *sliceType
1072		if tt := builtinIdToType(fw); tt != nil {
1073			sw, _ = tt.(*sliceType)
1074		} else if wire != nil {
1075			sw = wire.SliceT
1076		}
1077		elem := userType(t.Elem()).base
1078		return sw != nil && dec.compatibleType(elem, sw.Elem, inProgress)
1079	case reflect.Struct:
1080		return true
1081	}
1082}
1083
1084// typeString returns a human-readable description of the type identified by remoteId.
1085func (dec *Decoder) typeString(remoteId typeId) string {
1086	typeLock.Lock()
1087	defer typeLock.Unlock()
1088	if t := idToType(remoteId); t != nil {
1089		// globally known type.
1090		return t.string()
1091	}
1092	return dec.wireType[remoteId].string()
1093}
1094
1095// compileSingle compiles the decoder engine for a non-struct top-level value, including
1096// GobDecoders.
1097func (dec *Decoder) compileSingle(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
1098	rt := ut.user
1099	engine = new(decEngine)
1100	engine.instr = make([]decInstr, 1) // one item
1101	name := rt.String()                // best we can do
1102	if !dec.compatibleType(rt, remoteId, make(map[reflect.Type]typeId)) {
1103		remoteType := dec.typeString(remoteId)
1104		// Common confusing case: local interface type, remote concrete type.
1105		if ut.base.Kind() == reflect.Interface && remoteId != tInterface {
1106			return nil, errors.New("gob: local interface type " + name + " can only be decoded from remote interface type; received concrete type " + remoteType)
1107		}
1108		return nil, errors.New("gob: decoding into local type " + name + ", received remote type " + remoteType)
1109	}
1110	op := dec.decOpFor(remoteId, rt, name, make(map[reflect.Type]*decOp))
1111	ovfl := errors.New(`value for "` + name + `" out of range`)
1112	engine.instr[singletonField] = decInstr{*op, singletonField, nil, ovfl}
1113	engine.numInstr = 1
1114	return
1115}
1116
1117// compileIgnoreSingle compiles the decoder engine for a non-struct top-level value that will be discarded.
1118func (dec *Decoder) compileIgnoreSingle(remoteId typeId) *decEngine {
1119	engine := new(decEngine)
1120	engine.instr = make([]decInstr, 1) // one item
1121	op := dec.decIgnoreOpFor(remoteId, make(map[typeId]*decOp))
1122	ovfl := overflow(dec.typeString(remoteId))
1123	engine.instr[0] = decInstr{*op, 0, nil, ovfl}
1124	engine.numInstr = 1
1125	return engine
1126}
1127
1128// compileDec compiles the decoder engine for a value. If the value is not a struct,
1129// it calls out to compileSingle.
1130func (dec *Decoder) compileDec(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
1131	defer catchError(&err)
1132	rt := ut.base
1133	srt := rt
1134	if srt.Kind() != reflect.Struct || ut.externalDec != 0 {
1135		return dec.compileSingle(remoteId, ut)
1136	}
1137	var wireStruct *structType
1138	// Builtin types can come from global pool; the rest must be defined by the decoder.
1139	// Also we know we're decoding a struct now, so the client must have sent one.
1140	if t := builtinIdToType(remoteId); t != nil {
1141		wireStruct, _ = t.(*structType)
1142	} else {
1143		wire := dec.wireType[remoteId]
1144		if wire == nil {
1145			error_(errBadType)
1146		}
1147		wireStruct = wire.StructT
1148	}
1149	if wireStruct == nil {
1150		errorf("type mismatch in decoder: want struct type %s; got non-struct", rt)
1151	}
1152	engine = new(decEngine)
1153	engine.instr = make([]decInstr, len(wireStruct.Field))
1154	seen := make(map[reflect.Type]*decOp)
1155	// Loop over the fields of the wire type.
1156	for fieldnum := 0; fieldnum < len(wireStruct.Field); fieldnum++ {
1157		wireField := wireStruct.Field[fieldnum]
1158		if wireField.Name == "" {
1159			errorf("empty name for remote field of type %s", wireStruct.Name)
1160		}
1161		ovfl := overflow(wireField.Name)
1162		// Find the field of the local type with the same name.
1163		localField, present := srt.FieldByName(wireField.Name)
1164		// TODO(r): anonymous names
1165		if !present || !isExported(wireField.Name) {
1166			op := dec.decIgnoreOpFor(wireField.Id, make(map[typeId]*decOp))
1167			engine.instr[fieldnum] = decInstr{*op, fieldnum, nil, ovfl}
1168			continue
1169		}
1170		if !dec.compatibleType(localField.Type, wireField.Id, make(map[reflect.Type]typeId)) {
1171			errorf("wrong type (%s) for received field %s.%s", localField.Type, wireStruct.Name, wireField.Name)
1172		}
1173		op := dec.decOpFor(wireField.Id, localField.Type, localField.Name, seen)
1174		engine.instr[fieldnum] = decInstr{*op, fieldnum, localField.Index, ovfl}
1175		engine.numInstr++
1176	}
1177	return
1178}
1179
1180// getDecEnginePtr returns the engine for the specified type.
1181func (dec *Decoder) getDecEnginePtr(remoteId typeId, ut *userTypeInfo) (enginePtr **decEngine, err error) {
1182	rt := ut.user
1183	decoderMap, ok := dec.decoderCache[rt]
1184	if !ok {
1185		decoderMap = make(map[typeId]**decEngine)
1186		dec.decoderCache[rt] = decoderMap
1187	}
1188	if enginePtr, ok = decoderMap[remoteId]; !ok {
1189		// To handle recursive types, mark this engine as underway before compiling.
1190		enginePtr = new(*decEngine)
1191		decoderMap[remoteId] = enginePtr
1192		*enginePtr, err = dec.compileDec(remoteId, ut)
1193		if err != nil {
1194			delete(decoderMap, remoteId)
1195		}
1196	}
1197	return
1198}
1199
1200// emptyStruct is the type we compile into when ignoring a struct value.
1201type emptyStruct struct{}
1202
1203var emptyStructType = reflect.TypeFor[emptyStruct]()
1204
1205// getIgnoreEnginePtr returns the engine for the specified type when the value is to be discarded.
1206func (dec *Decoder) getIgnoreEnginePtr(wireId typeId) (enginePtr **decEngine, err error) {
1207	var ok bool
1208	if enginePtr, ok = dec.ignorerCache[wireId]; !ok {
1209		// To handle recursive types, mark this engine as underway before compiling.
1210		enginePtr = new(*decEngine)
1211		dec.ignorerCache[wireId] = enginePtr
1212		wire := dec.wireType[wireId]
1213		if wire != nil && wire.StructT != nil {
1214			*enginePtr, err = dec.compileDec(wireId, userType(emptyStructType))
1215		} else {
1216			*enginePtr = dec.compileIgnoreSingle(wireId)
1217		}
1218		if err != nil {
1219			delete(dec.ignorerCache, wireId)
1220		}
1221	}
1222	return
1223}
1224
1225// decodeValue decodes the data stream representing a value and stores it in value.
1226func (dec *Decoder) decodeValue(wireId typeId, value reflect.Value) {
1227	defer catchError(&dec.err)
1228	// If the value is nil, it means we should just ignore this item.
1229	if !value.IsValid() {
1230		dec.decodeIgnoredValue(wireId)
1231		return
1232	}
1233	// Dereference down to the underlying type.
1234	ut := userType(value.Type())
1235	base := ut.base
1236	var enginePtr **decEngine
1237	enginePtr, dec.err = dec.getDecEnginePtr(wireId, ut)
1238	if dec.err != nil {
1239		return
1240	}
1241	value = decAlloc(value)
1242	engine := *enginePtr
1243	if st := base; st.Kind() == reflect.Struct && ut.externalDec == 0 {
1244		wt := dec.wireType[wireId]
1245		if engine.numInstr == 0 && st.NumField() > 0 &&
1246			wt != nil && len(wt.StructT.Field) > 0 {
1247			name := base.Name()
1248			errorf("type mismatch: no fields matched compiling decoder for %s", name)
1249		}
1250		dec.decodeStruct(engine, value)
1251	} else {
1252		dec.decodeSingle(engine, value)
1253	}
1254}
1255
1256// decodeIgnoredValue decodes the data stream representing a value of the specified type and discards it.
1257func (dec *Decoder) decodeIgnoredValue(wireId typeId) {
1258	var enginePtr **decEngine
1259	enginePtr, dec.err = dec.getIgnoreEnginePtr(wireId)
1260	if dec.err != nil {
1261		return
1262	}
1263	wire := dec.wireType[wireId]
1264	if wire != nil && wire.StructT != nil {
1265		dec.ignoreStruct(*enginePtr)
1266	} else {
1267		dec.ignoreSingle(*enginePtr)
1268	}
1269}
1270
1271const (
1272	intBits     = 32 << (^uint(0) >> 63)
1273	uintptrBits = 32 << (^uintptr(0) >> 63)
1274)
1275
1276func init() {
1277	var iop, uop decOp
1278	switch intBits {
1279	case 32:
1280		iop = decInt32
1281		uop = decUint32
1282	case 64:
1283		iop = decInt64
1284		uop = decUint64
1285	default:
1286		panic("gob: unknown size of int/uint")
1287	}
1288	decOpTable[reflect.Int] = iop
1289	decOpTable[reflect.Uint] = uop
1290
1291	// Finally uintptr
1292	switch uintptrBits {
1293	case 32:
1294		uop = decUint32
1295	case 64:
1296		uop = decUint64
1297	default:
1298		panic("gob: unknown size of uintptr")
1299	}
1300	decOpTable[reflect.Uintptr] = uop
1301}
1302
1303// Gob depends on being able to take the address
1304// of zeroed Values it creates, so use this wrapper instead
1305// of the standard reflect.Zero.
1306// Each call allocates once.
1307func allocValue(t reflect.Type) reflect.Value {
1308	return reflect.New(t).Elem()
1309}
1310