decode.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  1. package bencode
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "io"
  7. "math/big"
  8. "reflect"
  9. "runtime"
  10. "strconv"
  11. "sync"
  12. )
  13. // The default bencode string length limit. This is a poor attempt to prevent excessive memory
  14. // allocation when parsing, but also leaves the window open to implement a better solution.
  15. const DefaultDecodeMaxStrLen = 1<<27 - 1 // ~128MiB
  16. type MaxStrLen = int64
  17. type Decoder struct {
  18. // Maximum parsed bencode string length. Defaults to DefaultMaxStrLen if zero.
  19. MaxStrLen MaxStrLen
  20. r interface {
  21. io.ByteScanner
  22. io.Reader
  23. }
  24. // Sum of bytes used to Decode values.
  25. Offset int64
  26. buf bytes.Buffer
  27. }
  28. func (d *Decoder) Decode(v interface{}) (err error) {
  29. defer func() {
  30. if err != nil {
  31. return
  32. }
  33. r := recover()
  34. if r == nil {
  35. return
  36. }
  37. _, ok := r.(runtime.Error)
  38. if ok {
  39. panic(r)
  40. }
  41. if err, ok = r.(error); !ok {
  42. panic(r)
  43. }
  44. // Errors thrown from deeper in parsing are unexpected. At value boundaries, errors should
  45. // be returned directly (at least until all the panic nonsense is removed entirely).
  46. if err == io.EOF {
  47. err = io.ErrUnexpectedEOF
  48. }
  49. }()
  50. pv := reflect.ValueOf(v)
  51. if pv.Kind() != reflect.Ptr || pv.IsNil() {
  52. return &UnmarshalInvalidArgError{reflect.TypeOf(v)}
  53. }
  54. ok, err := d.parseValue(pv.Elem())
  55. if err != nil {
  56. return
  57. }
  58. if !ok {
  59. d.throwSyntaxError(d.Offset-1, errors.New("unexpected 'e'"))
  60. }
  61. return
  62. }
  63. // Check for EOF in the decoder input stream. Used to assert the input ends on a clean message
  64. // boundary.
  65. func (d *Decoder) ReadEOF() error {
  66. _, err := d.r.ReadByte()
  67. if err == nil {
  68. err := d.r.UnreadByte()
  69. if err != nil {
  70. panic(err)
  71. }
  72. return errors.New("expected EOF")
  73. }
  74. if err == io.EOF {
  75. return nil
  76. }
  77. return fmt.Errorf("expected EOF, got %w", err)
  78. }
  79. func checkForUnexpectedEOF(err error, offset int64) {
  80. if err == io.EOF {
  81. panic(&SyntaxError{
  82. Offset: offset,
  83. What: io.ErrUnexpectedEOF,
  84. })
  85. }
  86. }
  87. func (d *Decoder) readByte() byte {
  88. b, err := d.r.ReadByte()
  89. if err != nil {
  90. checkForUnexpectedEOF(err, d.Offset)
  91. panic(err)
  92. }
  93. d.Offset++
  94. return b
  95. }
  96. // reads data writing it to 'd.buf' until 'sep' byte is encountered, 'sep' byte
  97. // is consumed, but not included into the 'd.buf'
  98. func (d *Decoder) readUntil(sep byte) {
  99. for {
  100. b := d.readByte()
  101. if b == sep {
  102. return
  103. }
  104. d.buf.WriteByte(b)
  105. }
  106. }
  107. func checkForIntParseError(err error, offset int64) {
  108. if err != nil {
  109. panic(&SyntaxError{
  110. Offset: offset,
  111. What: err,
  112. })
  113. }
  114. }
  115. func (d *Decoder) throwSyntaxError(offset int64, err error) {
  116. panic(&SyntaxError{
  117. Offset: offset,
  118. What: err,
  119. })
  120. }
  121. // Assume the 'i' is already consumed. Read and validate the rest of an int into the buffer.
  122. func (d *Decoder) readInt() error {
  123. // start := d.Offset - 1
  124. d.readUntil('e')
  125. if err := d.checkBufferedInt(); err != nil {
  126. return err
  127. }
  128. // if d.buf.Len() == 0 {
  129. // panic(&SyntaxError{
  130. // Offset: start,
  131. // What: errors.New("empty integer value"),
  132. // })
  133. // }
  134. return nil
  135. }
  136. // called when 'i' was consumed, for the integer type in v.
  137. func (d *Decoder) parseInt(v reflect.Value) error {
  138. start := d.Offset - 1
  139. if err := d.readInt(); err != nil {
  140. return err
  141. }
  142. s := bytesAsString(d.buf.Bytes())
  143. switch v.Kind() {
  144. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  145. n, err := strconv.ParseInt(s, 10, 64)
  146. checkForIntParseError(err, start)
  147. if v.OverflowInt(n) {
  148. return &UnmarshalTypeError{
  149. BencodeTypeName: "int",
  150. UnmarshalTargetType: v.Type(),
  151. }
  152. }
  153. v.SetInt(n)
  154. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  155. n, err := strconv.ParseUint(s, 10, 64)
  156. checkForIntParseError(err, start)
  157. if v.OverflowUint(n) {
  158. return &UnmarshalTypeError{
  159. BencodeTypeName: "int",
  160. UnmarshalTargetType: v.Type(),
  161. }
  162. }
  163. v.SetUint(n)
  164. case reflect.Bool:
  165. v.SetBool(s != "0")
  166. default:
  167. return &UnmarshalTypeError{
  168. BencodeTypeName: "int",
  169. UnmarshalTargetType: v.Type(),
  170. }
  171. }
  172. d.buf.Reset()
  173. return nil
  174. }
  175. func (d *Decoder) checkBufferedInt() error {
  176. b := d.buf.Bytes()
  177. if len(b) <= 1 {
  178. return nil
  179. }
  180. if b[0] == '-' {
  181. b = b[1:]
  182. }
  183. if b[0] < '1' || b[0] > '9' {
  184. return errors.New("invalid leading digit")
  185. }
  186. return nil
  187. }
  188. func (d *Decoder) parseStringLength() (int, error) {
  189. // We should have already consumed the first byte of the length into the Decoder buf.
  190. start := d.Offset - 1
  191. d.readUntil(':')
  192. if err := d.checkBufferedInt(); err != nil {
  193. return 0, err
  194. }
  195. // Really the limit should be the uint size for the platform. But we can't pass in an allocator,
  196. // or limit total memory use in Go, the best we might hope to do is limit the size of a single
  197. // decoded value (by reading it in in-place and then operating on a view).
  198. length, err := strconv.ParseInt(bytesAsString(d.buf.Bytes()), 10, 0)
  199. checkForIntParseError(err, start)
  200. if int64(length) > d.getMaxStrLen() {
  201. err = fmt.Errorf("parsed string length %v exceeds limit (%v)", length, DefaultDecodeMaxStrLen)
  202. }
  203. d.buf.Reset()
  204. return int(length), err
  205. }
  206. func (d *Decoder) parseString(v reflect.Value) error {
  207. length, err := d.parseStringLength()
  208. if err != nil {
  209. return err
  210. }
  211. defer d.buf.Reset()
  212. read := func(b []byte) {
  213. n, err := io.ReadFull(d.r, b)
  214. d.Offset += int64(n)
  215. if err != nil {
  216. checkForUnexpectedEOF(err, d.Offset)
  217. panic(&SyntaxError{
  218. Offset: d.Offset,
  219. What: errors.New("unexpected I/O error: " + err.Error()),
  220. })
  221. }
  222. }
  223. switch v.Kind() {
  224. case reflect.String:
  225. b := make([]byte, length)
  226. read(b)
  227. v.SetString(bytesAsString(b))
  228. return nil
  229. case reflect.Slice:
  230. if v.Type().Elem().Kind() != reflect.Uint8 {
  231. break
  232. }
  233. b := make([]byte, length)
  234. read(b)
  235. v.SetBytes(b)
  236. return nil
  237. case reflect.Array:
  238. if v.Type().Elem().Kind() != reflect.Uint8 {
  239. break
  240. }
  241. d.buf.Grow(length)
  242. b := d.buf.Bytes()[:length]
  243. read(b)
  244. reflect.Copy(v, reflect.ValueOf(b))
  245. return nil
  246. case reflect.Bool:
  247. d.buf.Grow(length)
  248. b := d.buf.Bytes()[:length]
  249. read(b)
  250. x, err := strconv.ParseBool(bytesAsString(b))
  251. if err != nil {
  252. x = length != 0
  253. }
  254. v.SetBool(x)
  255. return nil
  256. }
  257. // Can't move this into default clause because some cases above fail through to here after
  258. // additional checks.
  259. d.buf.Grow(length)
  260. read(d.buf.Bytes()[:length])
  261. // I believe we return here to support "ignore_unmarshal_type_error".
  262. return &UnmarshalTypeError{
  263. BencodeTypeName: "string",
  264. UnmarshalTargetType: v.Type(),
  265. }
  266. }
  267. // Info for parsing a dict value.
  268. type dictField struct {
  269. Type reflect.Type
  270. Get func(value reflect.Value) func(reflect.Value)
  271. Tags tag
  272. }
  273. // Returns specifics for parsing a dict field value.
  274. func getDictField(dict reflect.Type, key reflect.Value) (_ dictField, err error) {
  275. // get valuev as a map value or as a struct field
  276. switch k := dict.Kind(); k {
  277. case reflect.Map:
  278. return dictField{
  279. Type: dict.Elem(),
  280. Get: func(mapValue reflect.Value) func(reflect.Value) {
  281. return func(value reflect.Value) {
  282. if mapValue.IsNil() {
  283. mapValue.Set(reflect.MakeMap(dict))
  284. }
  285. // Assigns the value into the map.
  286. mapValue.SetMapIndex(key, value)
  287. }
  288. },
  289. }, nil
  290. case reflect.Struct:
  291. if key.Kind() != reflect.String {
  292. // This doesn't make sense for structs. They have to use strings. If they didn't they
  293. // should at least have things that convert to strings trivially and somehow much the
  294. // bencode tag.
  295. panic(key)
  296. }
  297. return getStructFieldForKey(dict, key.String()), nil
  298. // if sf.r.PkgPath != "" {
  299. // panic(&UnmarshalFieldError{
  300. // Key: key,
  301. // Type: dict.Type(),
  302. // Field: sf.r,
  303. // })
  304. // }
  305. default:
  306. err = fmt.Errorf("can't assign bencode dict items into a %v", k)
  307. return
  308. }
  309. }
  310. var (
  311. structFieldsMu sync.Mutex
  312. structFields = map[reflect.Type]map[string]dictField{}
  313. )
  314. func parseStructFields(struct_ reflect.Type, each func(key string, df dictField)) {
  315. for _i, n := 0, struct_.NumField(); _i < n; _i++ {
  316. i := _i
  317. f := struct_.Field(i)
  318. if f.Anonymous {
  319. t := f.Type
  320. if t.Kind() == reflect.Ptr {
  321. t = t.Elem()
  322. }
  323. parseStructFields(t, func(key string, df dictField) {
  324. innerGet := df.Get
  325. df.Get = func(value reflect.Value) func(reflect.Value) {
  326. anonPtr := value.Field(i)
  327. if anonPtr.Kind() == reflect.Ptr && anonPtr.IsNil() {
  328. anonPtr.Set(reflect.New(f.Type.Elem()))
  329. anonPtr = anonPtr.Elem()
  330. }
  331. return innerGet(anonPtr)
  332. }
  333. each(key, df)
  334. })
  335. continue
  336. }
  337. tagStr := f.Tag.Get("bencode")
  338. if tagStr == "-" {
  339. continue
  340. }
  341. tag := parseTag(tagStr)
  342. key := tag.Key()
  343. if key == "" {
  344. key = f.Name
  345. }
  346. each(key, dictField{f.Type, func(value reflect.Value) func(reflect.Value) {
  347. return value.Field(i).Set
  348. }, tag})
  349. }
  350. }
  351. func saveStructFields(struct_ reflect.Type) {
  352. m := make(map[string]dictField)
  353. parseStructFields(struct_, func(key string, sf dictField) {
  354. m[key] = sf
  355. })
  356. structFields[struct_] = m
  357. }
  358. func getStructFieldForKey(struct_ reflect.Type, key string) (f dictField) {
  359. structFieldsMu.Lock()
  360. if _, ok := structFields[struct_]; !ok {
  361. saveStructFields(struct_)
  362. }
  363. f, ok := structFields[struct_][key]
  364. structFieldsMu.Unlock()
  365. if !ok {
  366. var discard interface{}
  367. return dictField{
  368. Type: reflect.TypeOf(discard),
  369. Get: func(reflect.Value) func(reflect.Value) { return func(reflect.Value) {} },
  370. Tags: nil,
  371. }
  372. }
  373. return
  374. }
  375. var structKeyType = reflect.TypeFor[string]()
  376. func keyType(v reflect.Value) reflect.Type {
  377. switch v.Kind() {
  378. case reflect.Map:
  379. return v.Type().Key()
  380. case reflect.Struct:
  381. return structKeyType
  382. default:
  383. return nil
  384. }
  385. }
  386. func (d *Decoder) parseDict(v reflect.Value) error {
  387. // At this point 'd' byte was consumed, now read key/value pairs.
  388. // The key type does not need to be a string for maps.
  389. keyType := keyType(v)
  390. if keyType == nil {
  391. return fmt.Errorf("cannot parse dicts into %v", v.Type())
  392. }
  393. for {
  394. keyValue := reflect.New(keyType).Elem()
  395. ok, err := d.parseValue(keyValue)
  396. if err != nil {
  397. return fmt.Errorf("error parsing dict key: %w", err)
  398. }
  399. if !ok {
  400. return nil
  401. }
  402. df, err := getDictField(v.Type(), keyValue)
  403. if err != nil {
  404. return fmt.Errorf("parsing bencode dict into %v: %w", v.Type(), err)
  405. }
  406. // now we need to actually parse it
  407. if df.Type == nil {
  408. // Discard the value, there's nowhere to put it.
  409. var if_ interface{}
  410. if_, ok = d.parseValueInterface()
  411. if if_ == nil {
  412. return fmt.Errorf("error parsing value for key %q", keyValue)
  413. }
  414. if !ok {
  415. return fmt.Errorf("missing value for key %q", keyValue)
  416. }
  417. continue
  418. }
  419. setValue := reflect.New(df.Type).Elem()
  420. // log.Printf("parsing into %v", setValue.Type())
  421. ok, err = d.parseValue(setValue)
  422. if err != nil {
  423. var target *UnmarshalTypeError
  424. if !(errors.As(err, &target) && df.Tags.IgnoreUnmarshalTypeError()) {
  425. return fmt.Errorf("parsing value for key %q: %w", keyValue, err)
  426. }
  427. }
  428. if !ok {
  429. return fmt.Errorf("missing value for key %q", keyValue)
  430. }
  431. df.Get(v)(setValue)
  432. }
  433. }
  434. func (d *Decoder) parseList(v reflect.Value) error {
  435. switch v.Kind() {
  436. default:
  437. // If the list is a singleton of the expected type, use that value. See
  438. // https://github.com/anacrolix/torrent/issues/297.
  439. l := reflect.New(reflect.SliceOf(v.Type()))
  440. if err := d.parseList(l.Elem()); err != nil {
  441. return err
  442. }
  443. if l.Elem().Len() != 1 {
  444. return &UnmarshalTypeError{
  445. BencodeTypeName: "list",
  446. UnmarshalTargetType: v.Type(),
  447. }
  448. }
  449. v.Set(l.Elem().Index(0))
  450. return nil
  451. case reflect.Array, reflect.Slice:
  452. // We can work with this. Normal case, fallthrough.
  453. }
  454. i := 0
  455. for ; ; i++ {
  456. if v.Kind() == reflect.Slice && i >= v.Len() {
  457. v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
  458. }
  459. if i < v.Len() {
  460. ok, err := d.parseValue(v.Index(i))
  461. if err != nil {
  462. return err
  463. }
  464. if !ok {
  465. break
  466. }
  467. } else {
  468. _, ok := d.parseValueInterface()
  469. if !ok {
  470. break
  471. }
  472. }
  473. }
  474. if i < v.Len() {
  475. if v.Kind() == reflect.Array {
  476. z := reflect.Zero(v.Type().Elem())
  477. for n := v.Len(); i < n; i++ {
  478. v.Index(i).Set(z)
  479. }
  480. } else {
  481. v.SetLen(i)
  482. }
  483. }
  484. if i == 0 && v.Kind() == reflect.Slice {
  485. v.Set(reflect.MakeSlice(v.Type(), 0, 0))
  486. }
  487. return nil
  488. }
  489. func (d *Decoder) readOneValue() bool {
  490. b, err := d.r.ReadByte()
  491. if err != nil {
  492. panic(err)
  493. }
  494. if b == 'e' {
  495. d.r.UnreadByte()
  496. return false
  497. } else {
  498. d.Offset++
  499. d.buf.WriteByte(b)
  500. }
  501. switch b {
  502. case 'd', 'l':
  503. // read until there is nothing to read
  504. for d.readOneValue() {
  505. }
  506. // consume 'e' as well
  507. b = d.readByte()
  508. d.buf.WriteByte(b)
  509. case 'i':
  510. d.readUntil('e')
  511. d.buf.WriteString("e")
  512. default:
  513. if b >= '0' && b <= '9' {
  514. start := d.buf.Len() - 1
  515. d.readUntil(':')
  516. length, err := strconv.ParseInt(bytesAsString(d.buf.Bytes()[start:]), 10, 64)
  517. checkForIntParseError(err, d.Offset-1)
  518. d.buf.WriteString(":")
  519. n, err := io.CopyN(&d.buf, d.r, length)
  520. d.Offset += n
  521. if err != nil {
  522. checkForUnexpectedEOF(err, d.Offset)
  523. panic(&SyntaxError{
  524. Offset: d.Offset,
  525. What: errors.New("unexpected I/O error: " + err.Error()),
  526. })
  527. }
  528. break
  529. }
  530. d.raiseUnknownValueType(b, d.Offset-1)
  531. }
  532. return true
  533. }
  534. func (d *Decoder) parseUnmarshaler(v reflect.Value) bool {
  535. if !v.Type().Implements(unmarshalerType) {
  536. if v.Addr().Type().Implements(unmarshalerType) {
  537. v = v.Addr()
  538. } else {
  539. return false
  540. }
  541. }
  542. d.buf.Reset()
  543. if !d.readOneValue() {
  544. return false
  545. }
  546. m := v.Interface().(Unmarshaler)
  547. err := m.UnmarshalBencode(d.buf.Bytes())
  548. if err != nil {
  549. panic(&UnmarshalerError{v.Type(), err})
  550. }
  551. return true
  552. }
  553. // Returns true if there was a value and it's now stored in 'v'. Otherwise, there was an end symbol
  554. // ("e") and no value was stored.
  555. func (d *Decoder) parseValue(v reflect.Value) (bool, error) {
  556. // we support one level of indirection at the moment
  557. if v.Kind() == reflect.Ptr {
  558. // if the pointer is nil, allocate a new element of the type it
  559. // points to
  560. if v.IsNil() {
  561. v.Set(reflect.New(v.Type().Elem()))
  562. }
  563. v = v.Elem()
  564. }
  565. if d.parseUnmarshaler(v) {
  566. return true, nil
  567. }
  568. // common case: interface{}
  569. if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
  570. iface, _ := d.parseValueInterface()
  571. v.Set(reflect.ValueOf(iface))
  572. return true, nil
  573. }
  574. b, err := d.r.ReadByte()
  575. if err != nil {
  576. return false, err
  577. }
  578. d.Offset++
  579. switch b {
  580. case 'e':
  581. return false, nil
  582. case 'd':
  583. return true, d.parseDict(v)
  584. case 'l':
  585. return true, d.parseList(v)
  586. case 'i':
  587. return true, d.parseInt(v)
  588. default:
  589. if b >= '0' && b <= '9' {
  590. // It's a string.
  591. d.buf.Reset()
  592. // Write the first digit of the length to the buffer.
  593. d.buf.WriteByte(b)
  594. return true, d.parseString(v)
  595. }
  596. d.raiseUnknownValueType(b, d.Offset-1)
  597. }
  598. panic("unreachable")
  599. }
  600. // An unknown bencode type character was encountered.
  601. func (d *Decoder) raiseUnknownValueType(b byte, offset int64) {
  602. panic(&SyntaxError{
  603. Offset: offset,
  604. What: fmt.Errorf("unknown value type %+q", b),
  605. })
  606. }
  607. func (d *Decoder) parseValueInterface() (interface{}, bool) {
  608. b, err := d.r.ReadByte()
  609. if err != nil {
  610. panic(err)
  611. }
  612. d.Offset++
  613. switch b {
  614. case 'e':
  615. return nil, false
  616. case 'd':
  617. return d.parseDictInterface(), true
  618. case 'l':
  619. return d.parseListInterface(), true
  620. case 'i':
  621. return d.parseIntInterface(), true
  622. default:
  623. if b >= '0' && b <= '9' {
  624. // string
  625. // append first digit of the length to the buffer
  626. d.buf.WriteByte(b)
  627. return d.parseStringInterface(), true
  628. }
  629. d.raiseUnknownValueType(b, d.Offset-1)
  630. panic("unreachable")
  631. }
  632. }
  633. // Called after 'i', for an arbitrary integer size.
  634. func (d *Decoder) parseIntInterface() (ret interface{}) {
  635. start := d.Offset - 1
  636. if err := d.readInt(); err != nil {
  637. panic(err)
  638. }
  639. n, err := strconv.ParseInt(d.buf.String(), 10, 64)
  640. if ne, ok := err.(*strconv.NumError); ok && ne.Err == strconv.ErrRange {
  641. i := new(big.Int)
  642. _, ok := i.SetString(d.buf.String(), 10)
  643. if !ok {
  644. panic(&SyntaxError{
  645. Offset: start,
  646. What: errors.New("failed to parse integer"),
  647. })
  648. }
  649. ret = i
  650. } else {
  651. checkForIntParseError(err, start)
  652. ret = n
  653. }
  654. d.buf.Reset()
  655. return
  656. }
  657. func (d *Decoder) readBytes(length int) []byte {
  658. b, err := io.ReadAll(io.LimitReader(d.r, int64(length)))
  659. if err != nil {
  660. panic(err)
  661. }
  662. if len(b) != length {
  663. panic(fmt.Errorf("read %v bytes expected %v", len(b), length))
  664. }
  665. return b
  666. }
  667. func (d *Decoder) parseStringInterface() string {
  668. length, err := d.parseStringLength()
  669. if err != nil {
  670. panic(err)
  671. }
  672. b := d.readBytes(int(length))
  673. d.Offset += int64(len(b))
  674. if err != nil {
  675. panic(&SyntaxError{Offset: d.Offset, What: err})
  676. }
  677. return bytesAsString(b)
  678. }
  679. func (d *Decoder) parseDictInterface() interface{} {
  680. dict := make(map[string]interface{})
  681. var lastKey string
  682. lastKeyOk := false
  683. for {
  684. start := d.Offset
  685. keyi, ok := d.parseValueInterface()
  686. if !ok {
  687. break
  688. }
  689. key, ok := keyi.(string)
  690. if !ok {
  691. panic(&SyntaxError{
  692. Offset: d.Offset,
  693. What: errors.New("non-string key in a dict"),
  694. })
  695. }
  696. if lastKeyOk && key <= lastKey {
  697. d.throwSyntaxError(start, fmt.Errorf("dict keys unsorted: %q <= %q", key, lastKey))
  698. }
  699. start = d.Offset
  700. valuei, ok := d.parseValueInterface()
  701. if !ok {
  702. d.throwSyntaxError(start, fmt.Errorf("dict elem missing value [key=%v]", key))
  703. }
  704. lastKey = key
  705. lastKeyOk = true
  706. dict[key] = valuei
  707. }
  708. return dict
  709. }
  710. func (d *Decoder) parseListInterface() (list []interface{}) {
  711. list = []interface{}{}
  712. valuei, ok := d.parseValueInterface()
  713. for ok {
  714. list = append(list, valuei)
  715. valuei, ok = d.parseValueInterface()
  716. }
  717. return
  718. }
  719. func (d *Decoder) getMaxStrLen() int64 {
  720. if d.MaxStrLen == 0 {
  721. return DefaultDecodeMaxStrLen
  722. }
  723. return d.MaxStrLen
  724. }