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