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
598
599 safe := saferio.SliceCapWithSize(uint64(mtyp.Elem().Size()), uint64(n))
600 if safe < 0 {
601 safe = 1
602 }
603 value.Set(reflect.MakeMapWithSize(mtyp, safe))
604 }
605 keyIsPtr := mtyp.Key().Kind() == reflect.Pointer
606 elemIsPtr := mtyp.Elem().Kind() == reflect.Pointer
607 keyInstr := &decInstr{keyOp, 0, nil, ovfl}
608 elemInstr := &decInstr{elemOp, 0, nil, ovfl}
609 keyP := reflect.New(mtyp.Key())
610 elemP := reflect.New(mtyp.Elem())
611 for i := 0; i < n; i++ {
612 key := decodeIntoValue(state, keyOp, keyIsPtr, keyP.Elem(), keyInstr)
613 elem := decodeIntoValue(state, elemOp, elemIsPtr, elemP.Elem(), elemInstr)
614 value.SetMapIndex(key, elem)
615 keyP.Elem().SetZero()
616 elemP.Elem().SetZero()
617 }
618 }
619
620
621 func (dec *Decoder) ignoreArrayHelper(state *decoderState, elemOp decOp, length int) {
622 instr := &decInstr{elemOp, 0, nil, errors.New("no error")}
623 for i := 0; i < length; i++ {
624 if state.b.Len() == 0 {
625 errorf("decoding array or slice: length exceeds input size (%d elements)", length)
626 }
627 elemOp(instr, state, noValue)
628 }
629 }
630
631
632 func (dec *Decoder) ignoreArray(state *decoderState, elemOp decOp, length int) {
633 if n := state.decodeUint(); n != uint64(length) {
634 errorf("length mismatch in ignoreArray")
635 }
636 dec.ignoreArrayHelper(state, elemOp, length)
637 }
638
639
640 func (dec *Decoder) ignoreMap(state *decoderState, keyOp, elemOp decOp) {
641 n := int(state.decodeUint())
642 keyInstr := &decInstr{keyOp, 0, nil, errors.New("no error")}
643 elemInstr := &decInstr{elemOp, 0, nil, errors.New("no error")}
644 for i := 0; i < n; i++ {
645 keyOp(keyInstr, state, noValue)
646 elemOp(elemInstr, state, noValue)
647 }
648 }
649
650
651
652 func (dec *Decoder) decodeSlice(state *decoderState, value reflect.Value, elemOp decOp, ovfl error, helper decHelper) {
653 u := state.decodeUint()
654 typ := value.Type()
655 size := uint64(typ.Elem().Size())
656 nBytes := u * size
657 n := int(u)
658
659 if n < 0 || uint64(n) != u || nBytes > tooBig || (size > 0 && nBytes/size != u) {
660
661
662 errorf("%s slice too big: %d elements of %d bytes", typ.Elem(), u, size)
663 }
664 if value.Cap() < n {
665 safe := saferio.SliceCapWithSize(size, uint64(n))
666 if safe < 0 {
667 errorf("%s slice too big: %d elements of %d bytes", typ.Elem(), u, size)
668 }
669 value.Set(reflect.MakeSlice(typ, safe, safe))
670 } else {
671 value.SetLen(n)
672 }
673 dec.decodeArrayHelper(state, value, elemOp, n, ovfl, helper)
674 }
675
676
677 func (dec *Decoder) ignoreSlice(state *decoderState, elemOp decOp) {
678 dec.ignoreArrayHelper(state, elemOp, int(state.decodeUint()))
679 }
680
681
682
683
684 func (dec *Decoder) decodeInterface(ityp reflect.Type, state *decoderState, value reflect.Value) {
685
686 nr := state.decodeUint()
687 if nr > 1<<31 {
688 errorf("invalid type name length %d", nr)
689 }
690 if nr > uint64(state.b.Len()) {
691 errorf("invalid type name length %d: exceeds input size", nr)
692 }
693 n := int(nr)
694 name := state.b.Bytes()[:n]
695 state.b.Drop(n)
696
697 if len(name) == 0 {
698
699 value.SetZero()
700 return
701 }
702 if len(name) > 1024 {
703 errorf("name too long (%d bytes): %.20q...", len(name), name)
704 }
705
706 typi, ok := nameToConcreteType.Load(string(name))
707 if !ok {
708 errorf("name not registered for interface: %q", name)
709 }
710 typ := typi.(reflect.Type)
711
712
713 concreteId := dec.decodeTypeSequence(true)
714 if concreteId < 0 {
715 error_(dec.err)
716 }
717
718
719 state.decodeUint()
720
721 v := allocValue(typ)
722 dec.decodeValue(concreteId, v)
723 if dec.err != nil {
724 error_(dec.err)
725 }
726
727
728 if !typ.AssignableTo(ityp) {
729 errorf("%s is not assignable to type %s", typ, ityp)
730 }
731
732 value.Set(v)
733 }
734
735
736 func (dec *Decoder) ignoreInterface(state *decoderState) {
737
738 n, ok := state.getLength()
739 if !ok {
740 errorf("bad interface encoding: name too large for buffer")
741 }
742 bn := state.b.Len()
743 if bn < n {
744 errorf("invalid interface value length %d: exceeds input size %d", n, bn)
745 }
746 state.b.Drop(n)
747 id := dec.decodeTypeSequence(true)
748 if id < 0 {
749 error_(dec.err)
750 }
751
752 n, ok = state.getLength()
753 if !ok {
754 errorf("bad interface encoding: data length too large for buffer")
755 }
756 state.b.Drop(n)
757 }
758
759
760
761 func (dec *Decoder) decodeGobDecoder(ut *userTypeInfo, state *decoderState, value reflect.Value) {
762
763 n, ok := state.getLength()
764 if !ok {
765 errorf("GobDecoder: length too large for buffer")
766 }
767 b := state.b.Bytes()
768 if len(b) < n {
769 errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, len(b))
770 }
771 b = b[:n]
772 state.b.Drop(n)
773 var err error
774
775 switch ut.externalDec {
776 case xGob:
777 gobDecoder, _ := reflect.TypeAssert[GobDecoder](value)
778 err = gobDecoder.GobDecode(b)
779 case xBinary:
780 binaryUnmarshaler, _ := reflect.TypeAssert[encoding.BinaryUnmarshaler](value)
781 err = binaryUnmarshaler.UnmarshalBinary(b)
782 case xText:
783 textUnmarshaler, _ := reflect.TypeAssert[encoding.TextUnmarshaler](value)
784 err = textUnmarshaler.UnmarshalText(b)
785 }
786 if err != nil {
787 error_(err)
788 }
789 }
790
791
792 func (dec *Decoder) ignoreGobDecoder(state *decoderState) {
793
794 n, ok := state.getLength()
795 if !ok {
796 errorf("GobDecoder: length too large for buffer")
797 }
798 bn := state.b.Len()
799 if bn < n {
800 errorf("GobDecoder: invalid data length %d: exceeds input size %d", n, bn)
801 }
802 state.b.Drop(n)
803 }
804
805
806 var decOpTable = [...]decOp{
807 reflect.Bool: decBool,
808 reflect.Int8: decInt8,
809 reflect.Int16: decInt16,
810 reflect.Int32: decInt32,
811 reflect.Int64: decInt64,
812 reflect.Uint8: decUint8,
813 reflect.Uint16: decUint16,
814 reflect.Uint32: decUint32,
815 reflect.Uint64: decUint64,
816 reflect.Float32: decFloat32,
817 reflect.Float64: decFloat64,
818 reflect.Complex64: decComplex64,
819 reflect.Complex128: decComplex128,
820 reflect.String: decString,
821 }
822
823
824 var decIgnoreOpMap = map[typeId]decOp{
825 tBool: ignoreUint,
826 tInt: ignoreUint,
827 tUint: ignoreUint,
828 tFloat: ignoreUint,
829 tBytes: ignoreUint8Array,
830 tString: ignoreUint8Array,
831 tComplex: ignoreTwoUints,
832 }
833
834
835
836 func (dec *Decoder) decOpFor(wireId typeId, rt reflect.Type, name string, inProgress map[reflect.Type]*decOp) *decOp {
837 ut := userType(rt)
838
839 if ut.externalDec != 0 {
840 return dec.gobDecodeOpFor(ut)
841 }
842
843
844
845 if opPtr := inProgress[rt]; opPtr != nil {
846 return opPtr
847 }
848 typ := ut.base
849 var op decOp
850 k := typ.Kind()
851 if int(k) < len(decOpTable) {
852 op = decOpTable[k]
853 }
854 if op == nil {
855 inProgress[rt] = &op
856
857 switch t := typ; t.Kind() {
858 case reflect.Array:
859 name = "element of " + name
860 elemId := dec.wireType[wireId].ArrayT.Elem
861 elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
862 ovfl := overflow(name)
863 helper := decArrayHelper[t.Elem().Kind()]
864 op = func(i *decInstr, state *decoderState, value reflect.Value) {
865 state.dec.decodeArray(state, value, *elemOp, t.Len(), ovfl, helper)
866 }
867
868 case reflect.Map:
869 keyId := dec.wireType[wireId].MapT.Key
870 elemId := dec.wireType[wireId].MapT.Elem
871 keyOp := dec.decOpFor(keyId, t.Key(), "key of "+name, inProgress)
872 elemOp := dec.decOpFor(elemId, t.Elem(), "element of "+name, inProgress)
873 ovfl := overflow(name)
874 op = func(i *decInstr, state *decoderState, value reflect.Value) {
875 state.dec.decodeMap(t, state, value, *keyOp, *elemOp, ovfl)
876 }
877
878 case reflect.Slice:
879 name = "element of " + name
880 if t.Elem().Kind() == reflect.Uint8 {
881 op = decUint8Slice
882 break
883 }
884 var elemId typeId
885 if tt := builtinIdToType(wireId); tt != nil {
886 elemId = tt.(*sliceType).Elem
887 } else {
888 elemId = dec.wireType[wireId].SliceT.Elem
889 }
890 elemOp := dec.decOpFor(elemId, t.Elem(), name, inProgress)
891 ovfl := overflow(name)
892 helper := decSliceHelper[t.Elem().Kind()]
893 op = func(i *decInstr, state *decoderState, value reflect.Value) {
894 state.dec.decodeSlice(state, value, *elemOp, ovfl, helper)
895 }
896
897 case reflect.Struct:
898
899 ut := userType(typ)
900 enginePtr, err := dec.getDecEnginePtr(wireId, ut)
901 if err != nil {
902 error_(err)
903 }
904 op = func(i *decInstr, state *decoderState, value reflect.Value) {
905
906 dec.decodeStruct(*enginePtr, value)
907 }
908 case reflect.Interface:
909 op = func(i *decInstr, state *decoderState, value reflect.Value) {
910 state.dec.decodeInterface(t, state, value)
911 }
912 }
913 }
914 if op == nil {
915 errorf("decode can't handle type %s", rt)
916 }
917 return &op
918 }
919
920 var maxIgnoreNestingDepth = 10000
921
922
923 func (dec *Decoder) decIgnoreOpFor(wireId typeId, inProgress map[typeId]*decOp) *decOp {
924
925 dec.ignoreDepth++
926 defer func() { dec.ignoreDepth-- }()
927 if dec.ignoreDepth > maxIgnoreNestingDepth {
928 error_(errors.New("invalid nesting depth"))
929 }
930
931
932 if opPtr := inProgress[wireId]; opPtr != nil {
933 return opPtr
934 }
935 op, ok := decIgnoreOpMap[wireId]
936 if !ok {
937 inProgress[wireId] = &op
938 if wireId == tInterface {
939
940
941 op = func(i *decInstr, state *decoderState, value reflect.Value) {
942 state.dec.ignoreInterface(state)
943 }
944 return &op
945 }
946
947 wire := dec.wireType[wireId]
948 switch {
949 case wire == nil:
950 errorf("bad data: undefined type %s", wireId.string())
951 case wire.ArrayT != nil:
952 elemId := wire.ArrayT.Elem
953 elemOp := dec.decIgnoreOpFor(elemId, inProgress)
954 op = func(i *decInstr, state *decoderState, value reflect.Value) {
955 state.dec.ignoreArray(state, *elemOp, wire.ArrayT.Len)
956 }
957
958 case wire.MapT != nil:
959 keyId := dec.wireType[wireId].MapT.Key
960 elemId := dec.wireType[wireId].MapT.Elem
961 keyOp := dec.decIgnoreOpFor(keyId, inProgress)
962 elemOp := dec.decIgnoreOpFor(elemId, inProgress)
963 op = func(i *decInstr, state *decoderState, value reflect.Value) {
964 state.dec.ignoreMap(state, *keyOp, *elemOp)
965 }
966
967 case wire.SliceT != nil:
968 elemId := wire.SliceT.Elem
969 elemOp := dec.decIgnoreOpFor(elemId, inProgress)
970 op = func(i *decInstr, state *decoderState, value reflect.Value) {
971 state.dec.ignoreSlice(state, *elemOp)
972 }
973
974 case wire.StructT != nil:
975
976 enginePtr, err := dec.getIgnoreEnginePtr(wireId)
977 if err != nil {
978 error_(err)
979 }
980 op = func(i *decInstr, state *decoderState, value reflect.Value) {
981
982 state.dec.ignoreStruct(*enginePtr)
983 }
984
985 case wire.GobEncoderT != nil, wire.BinaryMarshalerT != nil, wire.TextMarshalerT != nil:
986 op = func(i *decInstr, state *decoderState, value reflect.Value) {
987 state.dec.ignoreGobDecoder(state)
988 }
989 }
990 }
991 if op == nil {
992 errorf("bad data: ignore can't handle type %s", wireId.string())
993 }
994 return &op
995 }
996
997
998
999 func (dec *Decoder) gobDecodeOpFor(ut *userTypeInfo) *decOp {
1000 rcvrType := ut.user
1001 if ut.decIndir == -1 {
1002 rcvrType = reflect.PointerTo(rcvrType)
1003 } else if ut.decIndir > 0 {
1004 for i := int8(0); i < ut.decIndir; i++ {
1005 rcvrType = rcvrType.Elem()
1006 }
1007 }
1008 var op decOp
1009 op = func(i *decInstr, state *decoderState, value reflect.Value) {
1010
1011 if value.Kind() != reflect.Pointer && rcvrType.Kind() == reflect.Pointer {
1012 value = value.Addr()
1013 }
1014 state.dec.decodeGobDecoder(ut, state, value)
1015 }
1016 return &op
1017 }
1018
1019
1020
1021
1022
1023 func (dec *Decoder) compatibleType(fr reflect.Type, fw typeId, inProgress map[reflect.Type]typeId) bool {
1024 if rhs, ok := inProgress[fr]; ok {
1025 return rhs == fw
1026 }
1027 inProgress[fr] = fw
1028 ut := userType(fr)
1029 wire, ok := dec.wireType[fw]
1030
1031
1032
1033
1034
1035
1036 if (ut.externalDec == xGob) != (ok && wire.GobEncoderT != nil) ||
1037 (ut.externalDec == xBinary) != (ok && wire.BinaryMarshalerT != nil) ||
1038 (ut.externalDec == xText) != (ok && wire.TextMarshalerT != nil) {
1039 return false
1040 }
1041 if ut.externalDec != 0 {
1042 return true
1043 }
1044 switch t := ut.base; t.Kind() {
1045 default:
1046
1047 return false
1048 case reflect.Bool:
1049 return fw == tBool
1050 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
1051 return fw == tInt
1052 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
1053 return fw == tUint
1054 case reflect.Float32, reflect.Float64:
1055 return fw == tFloat
1056 case reflect.Complex64, reflect.Complex128:
1057 return fw == tComplex
1058 case reflect.String:
1059 return fw == tString
1060 case reflect.Interface:
1061 return fw == tInterface
1062 case reflect.Array:
1063 if !ok || wire.ArrayT == nil {
1064 return false
1065 }
1066 array := wire.ArrayT
1067 return t.Len() == array.Len && dec.compatibleType(t.Elem(), array.Elem, inProgress)
1068 case reflect.Map:
1069 if !ok || wire.MapT == nil {
1070 return false
1071 }
1072 MapType := wire.MapT
1073 return dec.compatibleType(t.Key(), MapType.Key, inProgress) && dec.compatibleType(t.Elem(), MapType.Elem, inProgress)
1074 case reflect.Slice:
1075
1076 if t.Elem().Kind() == reflect.Uint8 {
1077 return fw == tBytes
1078 }
1079
1080 var sw *sliceType
1081 if tt := builtinIdToType(fw); tt != nil {
1082 sw, _ = tt.(*sliceType)
1083 } else if wire != nil {
1084 sw = wire.SliceT
1085 }
1086 elem := userType(t.Elem()).base
1087 return sw != nil && dec.compatibleType(elem, sw.Elem, inProgress)
1088 case reflect.Struct:
1089 return true
1090 }
1091 }
1092
1093
1094 func (dec *Decoder) typeString(remoteId typeId) string {
1095 typeLock.Lock()
1096 defer typeLock.Unlock()
1097 if t := idToType(remoteId); t != nil {
1098
1099 return t.string()
1100 }
1101 return dec.wireType[remoteId].string()
1102 }
1103
1104
1105
1106 func (dec *Decoder) compileSingle(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
1107 rt := ut.user
1108 engine = new(decEngine)
1109 engine.instr = make([]decInstr, 1)
1110 name := rt.String()
1111 if !dec.compatibleType(rt, remoteId, make(map[reflect.Type]typeId)) {
1112 remoteType := dec.typeString(remoteId)
1113
1114 if ut.base.Kind() == reflect.Interface && remoteId != tInterface {
1115 return nil, errors.New("gob: local interface type " + name + " can only be decoded from remote interface type; received concrete type " + remoteType)
1116 }
1117 return nil, errors.New("gob: decoding into local type " + name + ", received remote type " + remoteType)
1118 }
1119 op := dec.decOpFor(remoteId, rt, name, make(map[reflect.Type]*decOp))
1120 ovfl := errors.New(`value for "` + name + `" out of range`)
1121 engine.instr[singletonField] = decInstr{*op, singletonField, nil, ovfl}
1122 engine.numInstr = 1
1123 return
1124 }
1125
1126
1127 func (dec *Decoder) compileIgnoreSingle(remoteId typeId) *decEngine {
1128 engine := new(decEngine)
1129 engine.instr = make([]decInstr, 1)
1130 op := dec.decIgnoreOpFor(remoteId, make(map[typeId]*decOp))
1131 ovfl := overflow(dec.typeString(remoteId))
1132 engine.instr[0] = decInstr{*op, 0, nil, ovfl}
1133 engine.numInstr = 1
1134 return engine
1135 }
1136
1137
1138
1139 func (dec *Decoder) compileDec(remoteId typeId, ut *userTypeInfo) (engine *decEngine, err error) {
1140 defer catchError(&err)
1141 rt := ut.base
1142 srt := rt
1143 if srt.Kind() != reflect.Struct || ut.externalDec != 0 {
1144 return dec.compileSingle(remoteId, ut)
1145 }
1146 var wireStruct *structType
1147
1148
1149 if t := builtinIdToType(remoteId); t != nil {
1150 wireStruct, _ = t.(*structType)
1151 } else {
1152 wire := dec.wireType[remoteId]
1153 if wire == nil {
1154 error_(errBadType)
1155 }
1156 wireStruct = wire.StructT
1157 }
1158 if wireStruct == nil {
1159 errorf("type mismatch in decoder: want struct type %s; got non-struct", rt)
1160 }
1161 engine = new(decEngine)
1162 engine.instr = make([]decInstr, len(wireStruct.Field))
1163 seen := make(map[reflect.Type]*decOp)
1164
1165 for fieldnum := 0; fieldnum < len(wireStruct.Field); fieldnum++ {
1166 wireField := wireStruct.Field[fieldnum]
1167 if wireField.Name == "" {
1168 errorf("empty name for remote field of type %s", wireStruct.Name)
1169 }
1170 ovfl := overflow(wireField.Name)
1171
1172 localField, present := srt.FieldByName(wireField.Name)
1173
1174 if !present || !isExported(wireField.Name) {
1175 op := dec.decIgnoreOpFor(wireField.Id, make(map[typeId]*decOp))
1176 engine.instr[fieldnum] = decInstr{*op, fieldnum, nil, ovfl}
1177 continue
1178 }
1179 if !dec.compatibleType(localField.Type, wireField.Id, make(map[reflect.Type]typeId)) {
1180 errorf("wrong type (%s) for received field %s.%s", localField.Type, wireStruct.Name, wireField.Name)
1181 }
1182 op := dec.decOpFor(wireField.Id, localField.Type, localField.Name, seen)
1183 engine.instr[fieldnum] = decInstr{*op, fieldnum, localField.Index, ovfl}
1184 engine.numInstr++
1185 }
1186 return
1187 }
1188
1189
1190 func (dec *Decoder) getDecEnginePtr(remoteId typeId, ut *userTypeInfo) (enginePtr **decEngine, err error) {
1191 rt := ut.user
1192 decoderMap, ok := dec.decoderCache[rt]
1193 if !ok {
1194 decoderMap = make(map[typeId]**decEngine)
1195 dec.decoderCache[rt] = decoderMap
1196 }
1197 if enginePtr, ok = decoderMap[remoteId]; !ok {
1198
1199 enginePtr = new(*decEngine)
1200 decoderMap[remoteId] = enginePtr
1201 *enginePtr, err = dec.compileDec(remoteId, ut)
1202 if err != nil {
1203 delete(decoderMap, remoteId)
1204 }
1205 }
1206 return
1207 }
1208
1209
1210 type emptyStruct struct{}
1211
1212 var emptyStructType = reflect.TypeFor[emptyStruct]()
1213
1214
1215 func (dec *Decoder) getIgnoreEnginePtr(wireId typeId) (enginePtr **decEngine, err error) {
1216 var ok bool
1217 if enginePtr, ok = dec.ignorerCache[wireId]; !ok {
1218
1219 enginePtr = new(*decEngine)
1220 dec.ignorerCache[wireId] = enginePtr
1221 wire := dec.wireType[wireId]
1222 if wire != nil && wire.StructT != nil {
1223 *enginePtr, err = dec.compileDec(wireId, userType(emptyStructType))
1224 } else {
1225 *enginePtr = dec.compileIgnoreSingle(wireId)
1226 }
1227 if err != nil {
1228 delete(dec.ignorerCache, wireId)
1229 }
1230 }
1231 return
1232 }
1233
1234
1235 func (dec *Decoder) decodeValue(wireId typeId, value reflect.Value) {
1236 defer catchError(&dec.err)
1237
1238 if !value.IsValid() {
1239 dec.decodeIgnoredValue(wireId)
1240 return
1241 }
1242
1243 ut := userType(value.Type())
1244 base := ut.base
1245 var enginePtr **decEngine
1246 enginePtr, dec.err = dec.getDecEnginePtr(wireId, ut)
1247 if dec.err != nil {
1248 return
1249 }
1250 value = decAlloc(value)
1251 engine := *enginePtr
1252 if st := base; st.Kind() == reflect.Struct && ut.externalDec == 0 {
1253 wt := dec.wireType[wireId]
1254 if engine.numInstr == 0 && st.NumField() > 0 &&
1255 wt != nil && len(wt.StructT.Field) > 0 {
1256 name := base.Name()
1257 errorf("type mismatch: no fields matched compiling decoder for %s", name)
1258 }
1259 dec.decodeStruct(engine, value)
1260 } else {
1261 dec.decodeSingle(engine, value)
1262 }
1263 }
1264
1265
1266 func (dec *Decoder) decodeIgnoredValue(wireId typeId) {
1267 var enginePtr **decEngine
1268 enginePtr, dec.err = dec.getIgnoreEnginePtr(wireId)
1269 if dec.err != nil {
1270 return
1271 }
1272 wire := dec.wireType[wireId]
1273 if wire != nil && wire.StructT != nil {
1274 dec.ignoreStruct(*enginePtr)
1275 } else {
1276 dec.ignoreSingle(*enginePtr)
1277 }
1278 }
1279
1280 const (
1281 intBits = 32 << (^uint(0) >> 63)
1282 uintptrBits = 32 << (^uintptr(0) >> 63)
1283 )
1284
1285 func init() {
1286 var iop, uop decOp
1287 switch intBits {
1288 case 32:
1289 iop = decInt32
1290 uop = decUint32
1291 case 64:
1292 iop = decInt64
1293 uop = decUint64
1294 default:
1295 panic("gob: unknown size of int/uint")
1296 }
1297 decOpTable[reflect.Int] = iop
1298 decOpTable[reflect.Uint] = uop
1299
1300
1301 switch uintptrBits {
1302 case 32:
1303 uop = decUint32
1304 case 64:
1305 uop = decUint64
1306 default:
1307 panic("gob: unknown size of uintptr")
1308 }
1309 decOpTable[reflect.Uintptr] = uop
1310 }
1311
1312
1313
1314
1315
1316 func allocValue(t reflect.Type) reflect.Value {
1317 return reflect.New(t).Elem()
1318 }
1319
View as plain text