1
2
3
4
5
6
7 package gob
8
9 import (
10 "encoding"
11 "errors"
12 "internal/saferio"
13 "io"
14 "math"
15 "math/bits"
16 "reflect"
17 )
18
19 var (
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
25 type decHelper func(state *decoderState, v reflect.Value, length int, ovfl error) bool
26
27
28
29 type decoderState struct {
30 dec *Decoder
31
32
33 b *decBuffer
34 fieldnum int
35 next *decoderState
36 }
37
38
39
40 type decBuffer struct {
41 data []byte
42 offset int
43 }
44
45 func (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
54 func (d *decBuffer) Drop(n int) {
55 if n > d.Len() {
56 panic("drop")
57 }
58 d.offset += n
59 }
60
61 func (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
70 func (d *decBuffer) Len() int {
71 return len(d.data) - d.offset
72 }
73
74 func (d *decBuffer) Bytes() []byte {
75 return d.data[d.offset:]
76 }
77
78
79 func (d *decBuffer) SetBytes(data []byte) {
80 d.data = data
81 d.offset = 0
82 }
83
84 func (d *decBuffer) Reset() {
85 d.data = d.data[0:0]
86 d.offset = 0
87 }
88
89
90
91 func (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
103 func (dec *Decoder) freeDecoderState(d *decoderState) {
104 d.next = dec.freeList
105 dec.freeList = d
106 }
107
108 func overflow(name string) error {
109 return errors.New(`value for "` + name + `" out of range`)
110 }
111
112
113
114 func 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
137 for _, b := range buf[0:width] {
138 x = x<<8 | uint64(b)
139 }
140 width++
141 return
142 }
143
144
145
146 func (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
163
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
172
173 func (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
182
183
184 func (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
193 type decOp func(i *decInstr, state *decoderState, v reflect.Value)
194
195
196 type decInstr struct {
197 op decOp
198 field int
199 index []int
200 ovfl error
201 }
202
203
204 func ignoreUint(i *decInstr, state *decoderState, v reflect.Value) {
205 state.decodeUint()
206 }
207
208
209
210 func ignoreTwoUints(i *decInstr, state *decoderState, v reflect.Value) {
211 state.decodeUint()
212 state.decodeUint()
213 }
214
215
216
217
218
219
220
221
222
223
224
225
226 func 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
237 func decBool(i *decInstr, state *decoderState, value reflect.Value) {
238 value.SetBool(state.decodeUint() != 0)
239 }
240
241
242 func 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
251 func 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
260 func 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
269 func 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
278 func 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
287 func 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
296 func decInt64(i *decInstr, state *decoderState, value reflect.Value) {
297 v := state.decodeInt()
298 value.SetInt(v)
299 }
300
301
302 func decUint64(i *decInstr, state *decoderState, value reflect.Value) {
303 v := state.decodeUint()
304 value.SetUint(v)
305 }
306
307
308
309
310
311
312 func float64FromBits(u uint64) float64 {
313 v := bits.ReverseBytes64(u)
314 return math.Float64frombits(v)
315 }
316
317
318
319
320
321 func float32FromBits(u uint64, ovfl error) float64 {
322 v := float64FromBits(u)
323 av := v
324 if av < 0 {
325 av = -av
326 }
327
328 if math.MaxFloat32 < av && av <= math.MaxFloat64 {
329 error_(ovfl)
330 }
331 return v
332 }
333
334
335
336 func decFloat32(i *decInstr, state *decoderState, value reflect.Value) {
337 value.SetFloat(float32FromBits(state.decodeUint(), i.ovfl))
338 }
339
340
341
342 func decFloat64(i *decInstr, state *decoderState, value reflect.Value) {
343 value.SetFloat(float64FromBits(state.decodeUint()))
344 }
345
346
347
348
349 func 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
356
357
358 func 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
365
366
367 func 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
383
384
385
386
387 value.Grow(1)
388 }
389
390
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
411
412
413 func 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
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
429 func 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
442
443
444
445 type decEngine struct {
446 instr []decInstr
447 numInstr int
448 }
449
450
451
452
453 func (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
465
466
467
468
469 func (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 {
479 break
480 }
481 if state.fieldnum >= len(engine.instr)-delta {
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
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
499 var noValue reflect.Value
500
501
502 func (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 {
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
525
526 func (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
539 func (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
552
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
570
571
572 func (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
580 func 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
591
592
593
594 func (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
615 func (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
626 func (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
634 func (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
645
646 func (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
653 if n < 0 || uint64(n) != u || nBytes > tooBig || (size > 0 && nBytes/size != u) {
654
655
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
671 func (dec *Decoder) ignoreSlice(state *decoderState, elemOp decOp) {
672 dec.ignoreArrayHelper(state, elemOp, int(state.decodeUint()))
673 }
674
675
676
677
678 func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, value reflect.Value) {
679
680 nr := state.decodeUint()
681 if nr > 1<<31 {
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
691 if len(name) == 0 {
692
693 value.SetZero()
694 return
695 }
696 if len(name) > 1024 {
697 errorf("name too long (%d bytes): %.20q...", len(name), name)
698 }
699
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
707 concreteId := dec.decodeTypeSequence(true)
708 if concreteId < 0 {
709 error_(dec.err)
710 }
711
712
713 state.decodeUint()
714
715 v := allocValue(typ)
716 dec.decodeValue(concreteId, v)
717 if dec.err != nil {
718 error_(dec.err)
719 }
720
721
722 if !typ.AssignableTo(ityp) {
723 errorf("%s is not assignable to type %s", typ, ityp)
724 }
725
726 value.Set(v)
727 }
728
729
730 func (dec *Decoder) ignoreInterface(state *decoderState) {
731
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
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
754
755 func (dec *Decoder) decodeGobDecoder(ut *userTypeInfo, state *decoderState, value reflect.Value) {
756
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
769 switch ut.externalDec {
770 case xGob:
771 gobDecoder, _ := reflect.TypeAssert[GobDecoder](value)
772 err = gobDecoder.GobDecode(b)
773 case xBinary:
774 binaryUnmarshaler, _ := reflect.TypeAssert[encoding.BinaryUnmarshaler](value)
775 err = binaryUnmarshaler.UnmarshalBinary(b)
776 case xText:
777 textUnmarshaler, _ := reflect.TypeAssert[encoding.TextUnmarshaler](value)
778 err = textUnmarshaler.UnmarshalText(b)
779 }
780 if err != nil {
781 error_(err)
782 }
783 }
784
785
786 func (dec *Decoder) ignoreGobDecoder(state *decoderState) {
787
788 n, ok := state.getLength()
789 if !ok {
790 errorf("GobDecoder: length too large for buffer")
791 }
792 bn := state.b.Len()
793 if bn < n {
794 errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, bn)
795 }
796 state.b.Drop(n)
797 }
798
799
800 var decOpTable = [...]decOp{
801 reflect.Bool: decBool,
802 reflect.Int8: decInt8,
803 reflect.Int16: decInt16,
804 reflect.Int32: decInt32,
805 reflect.Int64: decInt64,
806 reflect.Uint8: decUint8,
807 reflect.Uint16: decUint16,
808 reflect.Uint32: decUint32,
809 reflect.Uint64: decUint64,
810 reflect.Float32: decFloat32,
811 reflect.Float64: decFloat64,
812 reflect.Complex64: decComplex64,
813 reflect.Complex128: decComplex128,
814 reflect.String: decString,
815 }
816
817
818 var decIgnoreOpMap = map[typeId]decOp{
819 tBool: ignoreUint,
820 tInt: ignoreUint,
821 tUint: ignoreUint,
822 tFloat: ignoreUint,
823 tBytes: ignoreUint8Array,
824 tString: ignoreUint8Array,
825 tComplex: ignoreTwoUints,
826 }
827
828
829
830 func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string, inProgress map[reflect.Type]*decOp) *decOp {
831 ut := userType(rt)
832
833 if ut.externalDec != 0 {
834 return dec.gobDecodeOpFor(ut)
835 }
836
837
838
839 if opPtr := inProgress[rt]; opPtr != nil {
840 return opPtr
841 }
842 typ := ut.base
843 var op decOp
844 k := typ.Kind()
845 if int(k) < len(decOpTable) {
846 op = decOpTable[k]
847 }
848 if op == nil {
849 inProgress[rt] = &op
850
851 switch t := typ; t.Kind() {
852 case reflect.Array:
853 name = "element of " + name
854 elemId := dec.wireType[wireId].ArrayT.Elem
855 elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
856 ovfl := overflow(name)
857 helper := decArrayHelper[t.Elem().Kind()]
858 op = func(i *decInstr, state *decoderState, value reflect.Value) {
859 state.dec.decodeArray(state, value, *elemOp, t.Len(), ovfl, helper)
860 }
861
862 case reflect.Map:
863 keyId := dec.wireType[wireId].MapT.Key
864 elemId := dec.wireType[wireId].MapT.Elem
865 keyOp := dec.decOpFor(keyId, t.Key(), "key of "+name, inProgress)
866 elemOp := dec.decOpFor(elemId, t.Elem(), "element of "+name, inProgress)
867 ovfl := overflow(name)
868 op = func(i *decInstr, state *decoderState, value reflect.Value) {
869 state.dec.decodeMap(t, state, value, *keyOp, *elemOp, ovfl)
870 }
871
872 case reflect.Slice:
873 name = "element of " + name
874 if t.Elem().Kind() == reflect.Uint8 {
875 op = decUint8Slice
876 break
877 }
878 var elemId typeId
879 if tt := builtinIdToType(wireId); tt != nil {
880 elemId = tt.(*sliceType).Elem
881 } else {
882 elemId = dec.wireType[wireId].SliceT.Elem
883 }
884 elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
885 ovfl := overflow(name)
886 helper := decSliceHelper[t.Elem().Kind()]
887 op = func(i *decInstr, state *decoderState, value reflect.Value) {
888 state.dec.decodeSlice(state, value, *elemOp, ovfl, helper)
889 }
890
891 case reflect.Struct:
892
893 ut := userType(typ)
894 enginePtr, err := dec.getDecEnginePtr(wireId, ut)
895 if err != nil {
896 error_(err)
897 }
898 op = func(i *decInstr, state *decoderState, value reflect.Value) {
899
900 dec.decodeStruct(*enginePtr, value)
901 }
902 case reflect.Interface:
903 op = func(i *decInstr, state *decoderState, value reflect.Value) {
904 state.dec.decodeInterface(t, state, value)
905 }
906 }
907 }
908 if op == nil {
909 errorf("decode can't handle type %s", rt)
910 }
911 return &op
912 }
913
914 var maxIgnoreNestingDepth = 10000
915
916
917 func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) *decOp {
918
919 dec.ignoreDepth++
920 defer func() { dec.ignoreDepth-- }()
921 if dec.ignoreDepth > maxIgnoreNestingDepth {
922 error_(errors.New("invalid nesting depth"))
923 }
924
925
926 if opPtr := inProgress[wireId]; opPtr != nil {
927 return opPtr
928 }
929 op, ok := decIgnoreOpMap[wireId]
930 if !ok {
931 inProgress[wireId] = &op
932 if wireId == tInterface {
933
934
935 op = func(i *decInstr, state *decoderState, value reflect.Value) {
936 state.dec.ignoreInterface(state)
937 }
938 return &op
939 }
940
941 wire := dec.wireType[wireId]
942 switch {
943 case wire == nil:
944 errorf("bad data: undefined type %s", wireId.string())
945 case wire.ArrayT != nil:
946 elemId := wire.ArrayT.Elem
947 elemOp := dec.decIgnoreOpFor(elemId, inProgress)
948 op = func(i *decInstr, state *decoderState, value reflect.Value) {
949 state.dec.ignoreArray(state, *elemOp, wire.ArrayT.Len)
950 }
951
952 case wire.MapT != nil:
953 keyId := dec.wireType[wireId].MapT.Key
954 elemId := dec.wireType[wireId].MapT.Elem
955 keyOp := dec.decIgnoreOpFor(keyId, inProgress)
956 elemOp := dec.decIgnoreOpFor(elemId, inProgress)
957 op = func(i *decInstr, state *decoderState, value reflect.Value) {
958 state.dec.ignoreMap(state, *keyOp, *elemOp)
959 }
960
961 case wire.SliceT != nil:
962 elemId := wire.SliceT.Elem
963 elemOp := dec.decIgnoreOpFor(elemId, inProgress)
964 op = func(i *decInstr, state *decoderState, value reflect.Value) {
965 state.dec.ignoreSlice(state, *elemOp)
966 }
967
968 case wire.StructT != nil:
969
970 enginePtr, err := dec.getIgnoreEnginePtr(wireId)
971 if err != nil {
972 error_(err)
973 }
974 op = func(i *decInstr, state *decoderState, value reflect.Value) {
975
976 state.dec.ignoreStruct(*enginePtr)
977 }
978
979 case wire.GobEncoderT != nil, wire.BinaryMarshalerT != nil, wire.TextMarshalerT != nil:
980 op = func(i *decInstr, state *decoderState, value reflect.Value) {
981 state.dec.ignoreGobDecoder(state)
982 }
983 }
984 }
985 if op == nil {
986 errorf("bad data: ignore can't handle type %s", wireId.string())
987 }
988 return &op
989 }
990
991
992
993 func (dec *Decoder) gobDecodeOpFor(ut *userTypeInfo) *decOp {
994 rcvrType := ut.user
995 if ut.decIndir == -1 {
996 rcvrType = reflect.PointerTo(rcvrType)
997 } else if ut.decIndir > 0 {
998 for i := int8(0); i < ut.decIndir; i++ {
999 rcvrType = rcvrType.Elem()
1000 }
1001 }
1002 var op decOp
1003 op = func(i *decInstr, state *decoderState, value reflect.Value) {
1004
1005 if value.Kind() != reflect.Pointer && rcvrType.Kind() == reflect.Pointer {
1006 value = value.Addr()
1007 }
1008 state.dec.decodeGobDecoder(ut, state, value)
1009 }
1010 return &op
1011 }
1012
1013
1014
1015
1016
1017 func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId, inProgress map[reflect.Type]typeId) bool {
1018 if rhs, ok := inProgress[fr]; ok {
1019 return rhs == fw
1020 }
1021 inProgress[fr] = fw
1022 ut := userType(fr)
1023 wire, ok := dec.wireType[fw]
1024
1025
1026
1027
1028
1029
1030 if (ut.externalDec == xGob) != (ok && wire.GobEncoderT != nil) ||
1031 (ut.externalDec == xBinary) != (ok && wire.BinaryMarshalerT != nil) ||
1032 (ut.externalDec == xText) != (ok && wire.TextMarshalerT != nil) {
1033 return false
1034 }
1035 if ut.externalDec != 0 {
1036 return true
1037 }
1038 switch t := ut.base; t.Kind() {
1039 default:
1040
1041 return false
1042 case reflect.Bool:
1043 return fw == tBool
1044 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
1045 return fw == tInt
1046 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
1047 return fw == tUint
1048 case reflect.Float32, reflect.Float64:
1049 return fw == tFloat
1050 case reflect.Complex64, reflect.Complex128:
1051 return fw == tComplex
1052 case reflect.String:
1053 return fw == tString
1054 case reflect.Interface:
1055 return fw == tInterface
1056 case reflect.Array:
1057 if !ok || wire.ArrayT == nil {
1058 return false
1059 }
1060 array := wire.ArrayT
1061 return t.Len() == array.Len && dec.compatibleType(t.Elem(), array.Elem, inProgress)
1062 case reflect.Map:
1063 if !ok || wire.MapT == nil {
1064 return false
1065 }
1066 MapType := wire.MapT
1067 return dec.compatibleType(t.Key(), MapType.Key, inProgress) && dec.compatibleType(t.Elem(), MapType.Elem, inProgress)
1068 case reflect.Slice:
1069
1070 if t.Elem().Kind() == reflect.Uint8 {
1071 return fw == tBytes
1072 }
1073
1074 var sw *sliceType
1075 if tt := builtinIdToType(fw); tt != nil {
1076 sw, _ = tt.(*sliceType)
1077 } else if wire != nil {
1078 sw = wire.SliceT
1079 }
1080 elem := userType(t.Elem()).base
1081 return sw != nil && dec.compatibleType(elem, sw.Elem, inProgress)
1082 case reflect.Struct:
1083 return true
1084 }
1085 }
1086
1087
1088 func (dec *Decoder) typeString(remoteId typeId) string {
1089 typeLock.Lock()
1090 defer typeLock.Unlock()
1091 if t := idToType(remoteId); t != nil {
1092
1093 return t.string()
1094 }
1095 return dec.wireType[remoteId].string()
1096 }
1097
1098
1099
1100 func (dec *Decoder) compileSingle(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
1101 rt := ut.user
1102 engine = new(decEngine)
1103 engine.instr = make([]decInstr, 1)
1104 name := rt.String()
1105 if !dec.compatibleType(rt, remoteId, make(map[reflect.Type]typeId)) {
1106 remoteType := dec.typeString(remoteId)
1107
1108 if ut.base.Kind() == reflect.Interface && remoteId != tInterface {
1109 return nil, errors.New("gob: local interface type " + name + " can only be decoded from remote interface type; received concrete type " + remoteType)
1110 }
1111 return nil, errors.New("gob: decoding into local type " + name + ", received remote type " + remoteType)
1112 }
1113 op := dec.decOpFor(remoteId, rt, name, make(map[reflect.Type]*decOp))
1114 ovfl := errors.New(`value for "` + name + `" out of range`)
1115 engine.instr[singletonField] = decInstr{*op, singletonField, nil, ovfl}
1116 engine.numInstr = 1
1117 return
1118 }
1119
1120
1121 func (dec *Decoder) compileIgnoreSingle(remoteId typeId) *decEngine {
1122 engine := new(decEngine)
1123 engine.instr = make([]decInstr, 1)
1124 op := dec.decIgnoreOpFor(remoteId, make(map[typeId]*decOp))
1125 ovfl := overflow(dec.typeString(remoteId))
1126 engine.instr[0] = decInstr{*op, 0, nil, ovfl}
1127 engine.numInstr = 1
1128 return engine
1129 }
1130
1131
1132
1133 func (dec *Decoder) compileDec(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
1134 defer catchError(&err)
1135 rt := ut.base
1136 srt := rt
1137 if srt.Kind() != reflect.Struct || ut.externalDec != 0 {
1138 return dec.compileSingle(remoteId, ut)
1139 }
1140 var wireStruct *structType
1141
1142
1143 if t := builtinIdToType(remoteId); t != nil {
1144 wireStruct, _ = t.(*structType)
1145 } else {
1146 wire := dec.wireType[remoteId]
1147 if wire == nil {
1148 error_(errBadType)
1149 }
1150 wireStruct = wire.StructT
1151 }
1152 if wireStruct == nil {
1153 errorf("type mismatch in decoder: want struct type %s; got non-struct", rt)
1154 }
1155 engine = new(decEngine)
1156 engine.instr = make([]decInstr, len(wireStruct.Field))
1157 seen := make(map[reflect.Type]*decOp)
1158
1159 for fieldnum := 0; fieldnum < len(wireStruct.Field); fieldnum++ {
1160 wireField := wireStruct.Field[fieldnum]
1161 if wireField.Name == "" {
1162 errorf("empty name for remote field of type %s", wireStruct.Name)
1163 }
1164 ovfl := overflow(wireField.Name)
1165
1166 localField, present := srt.FieldByName(wireField.Name)
1167
1168 if !present || !isExported(wireField.Name) {
1169 op := dec.decIgnoreOpFor(wireField.Id, make(map[typeId]*decOp))
1170 engine.instr[fieldnum] = decInstr{*op, fieldnum, nil, ovfl}
1171 continue
1172 }
1173 if !dec.compatibleType(localField.Type, wireField.Id, make(map[reflect.Type]typeId)) {
1174 errorf("wrong type (%s) for received field %s.%s", localField.Type, wireStruct.Name, wireField.Name)
1175 }
1176 op := dec.decOpFor(wireField.Id, localField.Type, localField.Name, seen)
1177 engine.instr[fieldnum] = decInstr{*op, fieldnum, localField.Index, ovfl}
1178 engine.numInstr++
1179 }
1180 return
1181 }
1182
1183
1184 func (dec *Decoder) getDecEnginePtr(remoteId typeId, ut *userTypeInfo) (enginePtr **decEngine, err error) {
1185 rt := ut.user
1186 decoderMap, ok := dec.decoderCache[rt]
1187 if !ok {
1188 decoderMap = make(map[typeId]**decEngine)
1189 dec.decoderCache[rt] = decoderMap
1190 }
1191 if enginePtr, ok = decoderMap[remoteId]; !ok {
1192
1193 enginePtr = new(*decEngine)
1194 decoderMap[remoteId] = enginePtr
1195 *enginePtr, err = dec.compileDec(remoteId, ut)
1196 if err != nil {
1197 delete(decoderMap, remoteId)
1198 }
1199 }
1200 return
1201 }
1202
1203
1204 type emptyStruct struct{}
1205
1206 var emptyStructType = reflect.TypeFor[emptyStruct]()
1207
1208
1209 func (dec *Decoder) getIgnoreEnginePtr(wireId typeId) (enginePtr **decEngine, err error) {
1210 var ok bool
1211 if enginePtr, ok = dec.ignorerCache[wireId]; !ok {
1212
1213 enginePtr = new(*decEngine)
1214 dec.ignorerCache[wireId] = enginePtr
1215 wire := dec.wireType[wireId]
1216 if wire != nil && wire.StructT != nil {
1217 *enginePtr, err = dec.compileDec(wireId, userType(emptyStructType))
1218 } else {
1219 *enginePtr = dec.compileIgnoreSingle(wireId)
1220 }
1221 if err != nil {
1222 delete(dec.ignorerCache, wireId)
1223 }
1224 }
1225 return
1226 }
1227
1228
1229 func (dec *Decoder) decodeValue(wireId typeId, value reflect.Value) {
1230 defer catchError(&dec.err)
1231
1232 if !value.IsValid() {
1233 dec.decodeIgnoredValue(wireId)
1234 return
1235 }
1236
1237 ut := userType(value.Type())
1238 base := ut.base
1239 var enginePtr **decEngine
1240 enginePtr, dec.err = dec.getDecEnginePtr(wireId, ut)
1241 if dec.err != nil {
1242 return
1243 }
1244 value = decAlloc(value)
1245 engine := *enginePtr
1246 if st := base; st.Kind() == reflect.Struct && ut.externalDec == 0 {
1247 wt := dec.wireType[wireId]
1248 if engine.numInstr == 0 && st.NumField() > 0 &&
1249 wt != nil && len(wt.StructT.Field) > 0 {
1250 name := base.Name()
1251 errorf("type mismatch: no fields matched compiling decoder for %s", name)
1252 }
1253 dec.decodeStruct(engine, value)
1254 } else {
1255 dec.decodeSingle(engine, value)
1256 }
1257 }
1258
1259
1260 func (dec *Decoder) decodeIgnoredValue(wireId typeId) {
1261 var enginePtr **decEngine
1262 enginePtr, dec.err = dec.getIgnoreEnginePtr(wireId)
1263 if dec.err != nil {
1264 return
1265 }
1266 wire := dec.wireType[wireId]
1267 if wire != nil && wire.StructT != nil {
1268 dec.ignoreStruct(*enginePtr)
1269 } else {
1270 dec.ignoreSingle(*enginePtr)
1271 }
1272 }
1273
1274 const (
1275 intBits = 32 << (^uint(0) >> 63)
1276 uintptrBits = 32 << (^uintptr(0) >> 63)
1277 )
1278
1279 func init() {
1280 var iop, uop decOp
1281 switch intBits {
1282 case 32:
1283 iop = decInt32
1284 uop = decUint32
1285 case 64:
1286 iop = decInt64
1287 uop = decUint64
1288 default:
1289 panic("gob: unknown size of int/uint")
1290 }
1291 decOpTable[reflect.Int] = iop
1292 decOpTable[reflect.Uint] = uop
1293
1294
1295 switch uintptrBits {
1296 case 32:
1297 uop = decUint32
1298 case 64:
1299 uop = decUint64
1300 default:
1301 panic("gob: unknown size of uintptr")
1302 }
1303 decOpTable[reflect.Uintptr] = uop
1304 }
1305
1306
1307
1308
1309
1310 func allocValue(t reflect.Type) reflect.Value {
1311 return reflect.New(t).Elem()
1312 }
1313
View as plain text