Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

925 righe
22 KiB

  1. // Copyright 2019+ Klaus Post. All rights reserved.
  2. // License information can be found in the LICENSE file.
  3. // Based on work by Yann Collet, released under BSD License.
  4. package zstd
  5. import (
  6. "bytes"
  7. "context"
  8. "encoding/binary"
  9. "io"
  10. "sync"
  11. "github.com/klauspost/compress/zstd/internal/xxhash"
  12. )
  13. // Decoder provides decoding of zstandard streams.
  14. // The decoder has been designed to operate without allocations after a warmup.
  15. // This means that you should store the decoder for best performance.
  16. // To re-use a stream decoder, use the Reset(r io.Reader) error to switch to another stream.
  17. // A decoder can safely be re-used even if the previous stream failed.
  18. // To release the resources, you must call the Close() function on a decoder.
  19. type Decoder struct {
  20. o decoderOptions
  21. // Unreferenced decoders, ready for use.
  22. decoders chan *blockDec
  23. // Current read position used for Reader functionality.
  24. current decoderState
  25. // sync stream decoding
  26. syncStream struct {
  27. decodedFrame uint64
  28. br readerWrapper
  29. enabled bool
  30. inFrame bool
  31. }
  32. frame *frameDec
  33. // Custom dictionaries.
  34. // Always uses copies.
  35. dicts map[uint32]dict
  36. // streamWg is the waitgroup for all streams
  37. streamWg sync.WaitGroup
  38. }
  39. // decoderState is used for maintaining state when the decoder
  40. // is used for streaming.
  41. type decoderState struct {
  42. // current block being written to stream.
  43. decodeOutput
  44. // output in order to be written to stream.
  45. output chan decodeOutput
  46. // cancel remaining output.
  47. cancel context.CancelFunc
  48. // crc of current frame
  49. crc *xxhash.Digest
  50. flushed bool
  51. }
  52. var (
  53. // Check the interfaces we want to support.
  54. _ = io.WriterTo(&Decoder{})
  55. _ = io.Reader(&Decoder{})
  56. )
  57. // NewReader creates a new decoder.
  58. // A nil Reader can be provided in which case Reset can be used to start a decode.
  59. //
  60. // A Decoder can be used in two modes:
  61. //
  62. // 1) As a stream, or
  63. // 2) For stateless decoding using DecodeAll.
  64. //
  65. // Only a single stream can be decoded concurrently, but the same decoder
  66. // can run multiple concurrent stateless decodes. It is even possible to
  67. // use stateless decodes while a stream is being decoded.
  68. //
  69. // The Reset function can be used to initiate a new stream, which is will considerably
  70. // reduce the allocations normally caused by NewReader.
  71. func NewReader(r io.Reader, opts ...DOption) (*Decoder, error) {
  72. initPredefined()
  73. var d Decoder
  74. d.o.setDefault()
  75. for _, o := range opts {
  76. err := o(&d.o)
  77. if err != nil {
  78. return nil, err
  79. }
  80. }
  81. d.current.crc = xxhash.New()
  82. d.current.flushed = true
  83. if r == nil {
  84. d.current.err = ErrDecoderNilInput
  85. }
  86. // Transfer option dicts.
  87. d.dicts = make(map[uint32]dict, len(d.o.dicts))
  88. for _, dc := range d.o.dicts {
  89. d.dicts[dc.id] = dc
  90. }
  91. d.o.dicts = nil
  92. // Create decoders
  93. d.decoders = make(chan *blockDec, d.o.concurrent)
  94. for i := 0; i < d.o.concurrent; i++ {
  95. dec := newBlockDec(d.o.lowMem)
  96. dec.localFrame = newFrameDec(d.o)
  97. d.decoders <- dec
  98. }
  99. if r == nil {
  100. return &d, nil
  101. }
  102. return &d, d.Reset(r)
  103. }
  104. // Read bytes from the decompressed stream into p.
  105. // Returns the number of bytes written and any error that occurred.
  106. // When the stream is done, io.EOF will be returned.
  107. func (d *Decoder) Read(p []byte) (int, error) {
  108. var n int
  109. for {
  110. if len(d.current.b) > 0 {
  111. filled := copy(p, d.current.b)
  112. p = p[filled:]
  113. d.current.b = d.current.b[filled:]
  114. n += filled
  115. }
  116. if len(p) == 0 {
  117. break
  118. }
  119. if len(d.current.b) == 0 {
  120. // We have an error and no more data
  121. if d.current.err != nil {
  122. break
  123. }
  124. if !d.nextBlock(n == 0) {
  125. return n, d.current.err
  126. }
  127. }
  128. }
  129. if len(d.current.b) > 0 {
  130. if debugDecoder {
  131. println("returning", n, "still bytes left:", len(d.current.b))
  132. }
  133. // Only return error at end of block
  134. return n, nil
  135. }
  136. if d.current.err != nil {
  137. d.drainOutput()
  138. }
  139. if debugDecoder {
  140. println("returning", n, d.current.err, len(d.decoders))
  141. }
  142. return n, d.current.err
  143. }
  144. // Reset will reset the decoder the supplied stream after the current has finished processing.
  145. // Note that this functionality cannot be used after Close has been called.
  146. // Reset can be called with a nil reader to release references to the previous reader.
  147. // After being called with a nil reader, no other operations than Reset or DecodeAll or Close
  148. // should be used.
  149. func (d *Decoder) Reset(r io.Reader) error {
  150. if d.current.err == ErrDecoderClosed {
  151. return d.current.err
  152. }
  153. d.drainOutput()
  154. d.syncStream.br.r = nil
  155. if r == nil {
  156. d.current.err = ErrDecoderNilInput
  157. if len(d.current.b) > 0 {
  158. d.current.b = d.current.b[:0]
  159. }
  160. d.current.flushed = true
  161. return nil
  162. }
  163. // If bytes buffer and < 5MB, do sync decoding anyway.
  164. if bb, ok := r.(byter); ok && bb.Len() < 5<<20 {
  165. bb2 := bb
  166. if debugDecoder {
  167. println("*bytes.Buffer detected, doing sync decode, len:", bb.Len())
  168. }
  169. b := bb2.Bytes()
  170. var dst []byte
  171. if cap(d.current.b) > 0 {
  172. dst = d.current.b
  173. }
  174. dst, err := d.DecodeAll(b, dst[:0])
  175. if err == nil {
  176. err = io.EOF
  177. }
  178. d.current.b = dst
  179. d.current.err = err
  180. d.current.flushed = true
  181. if debugDecoder {
  182. println("sync decode to", len(dst), "bytes, err:", err)
  183. }
  184. return nil
  185. }
  186. // Remove current block.
  187. d.stashDecoder()
  188. d.current.decodeOutput = decodeOutput{}
  189. d.current.err = nil
  190. d.current.flushed = false
  191. d.current.d = nil
  192. // Ensure no-one else is still running...
  193. d.streamWg.Wait()
  194. if d.frame == nil {
  195. d.frame = newFrameDec(d.o)
  196. }
  197. if d.o.concurrent == 1 {
  198. return d.startSyncDecoder(r)
  199. }
  200. d.current.output = make(chan decodeOutput, d.o.concurrent)
  201. ctx, cancel := context.WithCancel(context.Background())
  202. d.current.cancel = cancel
  203. d.streamWg.Add(1)
  204. go d.startStreamDecoder(ctx, r, d.current.output)
  205. return nil
  206. }
  207. // drainOutput will drain the output until errEndOfStream is sent.
  208. func (d *Decoder) drainOutput() {
  209. if d.current.cancel != nil {
  210. if debugDecoder {
  211. println("cancelling current")
  212. }
  213. d.current.cancel()
  214. d.current.cancel = nil
  215. }
  216. if d.current.d != nil {
  217. if debugDecoder {
  218. printf("re-adding current decoder %p, decoders: %d", d.current.d, len(d.decoders))
  219. }
  220. d.decoders <- d.current.d
  221. d.current.d = nil
  222. d.current.b = nil
  223. }
  224. if d.current.output == nil || d.current.flushed {
  225. println("current already flushed")
  226. return
  227. }
  228. for v := range d.current.output {
  229. if v.d != nil {
  230. if debugDecoder {
  231. printf("re-adding decoder %p", v.d)
  232. }
  233. d.decoders <- v.d
  234. }
  235. }
  236. d.current.output = nil
  237. d.current.flushed = true
  238. }
  239. // WriteTo writes data to w until there's no more data to write or when an error occurs.
  240. // The return value n is the number of bytes written.
  241. // Any error encountered during the write is also returned.
  242. func (d *Decoder) WriteTo(w io.Writer) (int64, error) {
  243. var n int64
  244. for {
  245. if len(d.current.b) > 0 {
  246. n2, err2 := w.Write(d.current.b)
  247. n += int64(n2)
  248. if err2 != nil && (d.current.err == nil || d.current.err == io.EOF) {
  249. d.current.err = err2
  250. } else if n2 != len(d.current.b) {
  251. d.current.err = io.ErrShortWrite
  252. }
  253. }
  254. if d.current.err != nil {
  255. break
  256. }
  257. d.nextBlock(true)
  258. }
  259. err := d.current.err
  260. if err != nil {
  261. d.drainOutput()
  262. }
  263. if err == io.EOF {
  264. err = nil
  265. }
  266. return n, err
  267. }
  268. // DecodeAll allows stateless decoding of a blob of bytes.
  269. // Output will be appended to dst, so if the destination size is known
  270. // you can pre-allocate the destination slice to avoid allocations.
  271. // DecodeAll can be used concurrently.
  272. // The Decoder concurrency limits will be respected.
  273. func (d *Decoder) DecodeAll(input, dst []byte) ([]byte, error) {
  274. if d.decoders == nil {
  275. return dst, ErrDecoderClosed
  276. }
  277. // Grab a block decoder and frame decoder.
  278. block := <-d.decoders
  279. frame := block.localFrame
  280. defer func() {
  281. if debugDecoder {
  282. printf("re-adding decoder: %p", block)
  283. }
  284. frame.rawInput = nil
  285. frame.bBuf = nil
  286. if frame.history.decoders.br != nil {
  287. frame.history.decoders.br.in = nil
  288. }
  289. d.decoders <- block
  290. }()
  291. frame.bBuf = input
  292. for {
  293. frame.history.reset()
  294. err := frame.reset(&frame.bBuf)
  295. if err != nil {
  296. if err == io.EOF {
  297. if debugDecoder {
  298. println("frame reset return EOF")
  299. }
  300. return dst, nil
  301. }
  302. return dst, err
  303. }
  304. if frame.DictionaryID != nil {
  305. dict, ok := d.dicts[*frame.DictionaryID]
  306. if !ok {
  307. return nil, ErrUnknownDictionary
  308. }
  309. if debugDecoder {
  310. println("setting dict", frame.DictionaryID)
  311. }
  312. frame.history.setDict(&dict)
  313. }
  314. if frame.WindowSize > d.o.maxWindowSize {
  315. if debugDecoder {
  316. println("window size exceeded:", frame.WindowSize, ">", d.o.maxWindowSize)
  317. }
  318. return dst, ErrWindowSizeExceeded
  319. }
  320. if frame.FrameContentSize != fcsUnknown {
  321. if frame.FrameContentSize > d.o.maxDecodedSize-uint64(len(dst)) {
  322. return dst, ErrDecoderSizeExceeded
  323. }
  324. if cap(dst)-len(dst) < int(frame.FrameContentSize) {
  325. dst2 := make([]byte, len(dst), len(dst)+int(frame.FrameContentSize)+compressedBlockOverAlloc)
  326. copy(dst2, dst)
  327. dst = dst2
  328. }
  329. }
  330. if cap(dst) == 0 {
  331. // Allocate len(input) * 2 by default if nothing is provided
  332. // and we didn't get frame content size.
  333. size := len(input) * 2
  334. // Cap to 1 MB.
  335. if size > 1<<20 {
  336. size = 1 << 20
  337. }
  338. if uint64(size) > d.o.maxDecodedSize {
  339. size = int(d.o.maxDecodedSize)
  340. }
  341. dst = make([]byte, 0, size)
  342. }
  343. dst, err = frame.runDecoder(dst, block)
  344. if err != nil {
  345. return dst, err
  346. }
  347. if len(frame.bBuf) == 0 {
  348. if debugDecoder {
  349. println("frame dbuf empty")
  350. }
  351. break
  352. }
  353. }
  354. return dst, nil
  355. }
  356. // nextBlock returns the next block.
  357. // If an error occurs d.err will be set.
  358. // Optionally the function can block for new output.
  359. // If non-blocking mode is used the returned boolean will be false
  360. // if no data was available without blocking.
  361. func (d *Decoder) nextBlock(blocking bool) (ok bool) {
  362. if d.current.err != nil {
  363. // Keep error state.
  364. return false
  365. }
  366. d.current.b = d.current.b[:0]
  367. // SYNC:
  368. if d.syncStream.enabled {
  369. if !blocking {
  370. return false
  371. }
  372. ok = d.nextBlockSync()
  373. if !ok {
  374. d.stashDecoder()
  375. }
  376. return ok
  377. }
  378. //ASYNC:
  379. d.stashDecoder()
  380. if blocking {
  381. d.current.decodeOutput, ok = <-d.current.output
  382. } else {
  383. select {
  384. case d.current.decodeOutput, ok = <-d.current.output:
  385. default:
  386. return false
  387. }
  388. }
  389. if !ok {
  390. // This should not happen, so signal error state...
  391. d.current.err = io.ErrUnexpectedEOF
  392. return false
  393. }
  394. next := d.current.decodeOutput
  395. if next.d != nil && next.d.async.newHist != nil {
  396. d.current.crc.Reset()
  397. }
  398. if debugDecoder {
  399. var tmp [4]byte
  400. binary.LittleEndian.PutUint32(tmp[:], uint32(xxhash.Sum64(next.b)))
  401. println("got", len(d.current.b), "bytes, error:", d.current.err, "data crc:", tmp)
  402. }
  403. if !d.o.ignoreChecksum && len(next.b) > 0 {
  404. n, err := d.current.crc.Write(next.b)
  405. if err == nil {
  406. if n != len(next.b) {
  407. d.current.err = io.ErrShortWrite
  408. }
  409. }
  410. }
  411. if next.err == nil && next.d != nil && len(next.d.checkCRC) != 0 {
  412. got := d.current.crc.Sum64()
  413. var tmp [4]byte
  414. binary.LittleEndian.PutUint32(tmp[:], uint32(got))
  415. if !d.o.ignoreChecksum && !bytes.Equal(tmp[:], next.d.checkCRC) {
  416. if debugDecoder {
  417. println("CRC Check Failed:", tmp[:], " (got) !=", next.d.checkCRC, "(on stream)")
  418. }
  419. d.current.err = ErrCRCMismatch
  420. } else {
  421. if debugDecoder {
  422. println("CRC ok", tmp[:])
  423. }
  424. }
  425. }
  426. return true
  427. }
  428. func (d *Decoder) nextBlockSync() (ok bool) {
  429. if d.current.d == nil {
  430. d.current.d = <-d.decoders
  431. }
  432. for len(d.current.b) == 0 {
  433. if !d.syncStream.inFrame {
  434. d.frame.history.reset()
  435. d.current.err = d.frame.reset(&d.syncStream.br)
  436. if d.current.err != nil {
  437. return false
  438. }
  439. if d.frame.DictionaryID != nil {
  440. dict, ok := d.dicts[*d.frame.DictionaryID]
  441. if !ok {
  442. d.current.err = ErrUnknownDictionary
  443. return false
  444. } else {
  445. d.frame.history.setDict(&dict)
  446. }
  447. }
  448. if d.frame.WindowSize > d.o.maxDecodedSize || d.frame.WindowSize > d.o.maxWindowSize {
  449. d.current.err = ErrDecoderSizeExceeded
  450. return false
  451. }
  452. d.syncStream.decodedFrame = 0
  453. d.syncStream.inFrame = true
  454. }
  455. d.current.err = d.frame.next(d.current.d)
  456. if d.current.err != nil {
  457. return false
  458. }
  459. d.frame.history.ensureBlock()
  460. if debugDecoder {
  461. println("History trimmed:", len(d.frame.history.b), "decoded already:", d.syncStream.decodedFrame)
  462. }
  463. histBefore := len(d.frame.history.b)
  464. d.current.err = d.current.d.decodeBuf(&d.frame.history)
  465. if d.current.err != nil {
  466. println("error after:", d.current.err)
  467. return false
  468. }
  469. d.current.b = d.frame.history.b[histBefore:]
  470. if debugDecoder {
  471. println("history after:", len(d.frame.history.b))
  472. }
  473. // Check frame size (before CRC)
  474. d.syncStream.decodedFrame += uint64(len(d.current.b))
  475. if d.syncStream.decodedFrame > d.frame.FrameContentSize {
  476. if debugDecoder {
  477. printf("DecodedFrame (%d) > FrameContentSize (%d)\n", d.syncStream.decodedFrame, d.frame.FrameContentSize)
  478. }
  479. d.current.err = ErrFrameSizeExceeded
  480. return false
  481. }
  482. // Check FCS
  483. if d.current.d.Last && d.frame.FrameContentSize != fcsUnknown && d.syncStream.decodedFrame != d.frame.FrameContentSize {
  484. if debugDecoder {
  485. printf("DecodedFrame (%d) != FrameContentSize (%d)\n", d.syncStream.decodedFrame, d.frame.FrameContentSize)
  486. }
  487. d.current.err = ErrFrameSizeMismatch
  488. return false
  489. }
  490. // Update/Check CRC
  491. if d.frame.HasCheckSum {
  492. if !d.o.ignoreChecksum {
  493. d.frame.crc.Write(d.current.b)
  494. }
  495. if d.current.d.Last {
  496. if !d.o.ignoreChecksum {
  497. d.current.err = d.frame.checkCRC()
  498. } else {
  499. d.current.err = d.frame.consumeCRC()
  500. }
  501. if d.current.err != nil {
  502. println("CRC error:", d.current.err)
  503. return false
  504. }
  505. }
  506. }
  507. d.syncStream.inFrame = !d.current.d.Last
  508. }
  509. return true
  510. }
  511. func (d *Decoder) stashDecoder() {
  512. if d.current.d != nil {
  513. if debugDecoder {
  514. printf("re-adding current decoder %p", d.current.d)
  515. }
  516. d.decoders <- d.current.d
  517. d.current.d = nil
  518. }
  519. }
  520. // Close will release all resources.
  521. // It is NOT possible to reuse the decoder after this.
  522. func (d *Decoder) Close() {
  523. if d.current.err == ErrDecoderClosed {
  524. return
  525. }
  526. d.drainOutput()
  527. if d.current.cancel != nil {
  528. d.current.cancel()
  529. d.streamWg.Wait()
  530. d.current.cancel = nil
  531. }
  532. if d.decoders != nil {
  533. close(d.decoders)
  534. for dec := range d.decoders {
  535. dec.Close()
  536. }
  537. d.decoders = nil
  538. }
  539. if d.current.d != nil {
  540. d.current.d.Close()
  541. d.current.d = nil
  542. }
  543. d.current.err = ErrDecoderClosed
  544. }
  545. // IOReadCloser returns the decoder as an io.ReadCloser for convenience.
  546. // Any changes to the decoder will be reflected, so the returned ReadCloser
  547. // can be reused along with the decoder.
  548. // io.WriterTo is also supported by the returned ReadCloser.
  549. func (d *Decoder) IOReadCloser() io.ReadCloser {
  550. return closeWrapper{d: d}
  551. }
  552. // closeWrapper wraps a function call as a closer.
  553. type closeWrapper struct {
  554. d *Decoder
  555. }
  556. // WriteTo forwards WriteTo calls to the decoder.
  557. func (c closeWrapper) WriteTo(w io.Writer) (n int64, err error) {
  558. return c.d.WriteTo(w)
  559. }
  560. // Read forwards read calls to the decoder.
  561. func (c closeWrapper) Read(p []byte) (n int, err error) {
  562. return c.d.Read(p)
  563. }
  564. // Close closes the decoder.
  565. func (c closeWrapper) Close() error {
  566. c.d.Close()
  567. return nil
  568. }
  569. type decodeOutput struct {
  570. d *blockDec
  571. b []byte
  572. err error
  573. }
  574. func (d *Decoder) startSyncDecoder(r io.Reader) error {
  575. d.frame.history.reset()
  576. d.syncStream.br = readerWrapper{r: r}
  577. d.syncStream.inFrame = false
  578. d.syncStream.enabled = true
  579. d.syncStream.decodedFrame = 0
  580. return nil
  581. }
  582. // Create Decoder:
  583. // ASYNC:
  584. // Spawn 3 go routines.
  585. // 0: Read frames and decode block literals.
  586. // 1: Decode sequences.
  587. // 2: Execute sequences, send to output.
  588. func (d *Decoder) startStreamDecoder(ctx context.Context, r io.Reader, output chan decodeOutput) {
  589. defer d.streamWg.Done()
  590. br := readerWrapper{r: r}
  591. var seqDecode = make(chan *blockDec, d.o.concurrent)
  592. var seqExecute = make(chan *blockDec, d.o.concurrent)
  593. // Async 1: Decode sequences...
  594. go func() {
  595. var hist history
  596. var hasErr bool
  597. for block := range seqDecode {
  598. if hasErr {
  599. if block != nil {
  600. seqExecute <- block
  601. }
  602. continue
  603. }
  604. if block.async.newHist != nil {
  605. if debugDecoder {
  606. println("Async 1: new history, recent:", block.async.newHist.recentOffsets)
  607. }
  608. hist.decoders = block.async.newHist.decoders
  609. hist.recentOffsets = block.async.newHist.recentOffsets
  610. hist.windowSize = block.async.newHist.windowSize
  611. if block.async.newHist.dict != nil {
  612. hist.setDict(block.async.newHist.dict)
  613. }
  614. }
  615. if block.err != nil || block.Type != blockTypeCompressed {
  616. hasErr = block.err != nil
  617. seqExecute <- block
  618. continue
  619. }
  620. hist.decoders.literals = block.async.literals
  621. block.err = block.prepareSequences(block.async.seqData, &hist)
  622. if debugDecoder && block.err != nil {
  623. println("prepareSequences returned:", block.err)
  624. }
  625. hasErr = block.err != nil
  626. if block.err == nil {
  627. block.err = block.decodeSequences(&hist)
  628. if debugDecoder && block.err != nil {
  629. println("decodeSequences returned:", block.err)
  630. }
  631. hasErr = block.err != nil
  632. // block.async.sequence = hist.decoders.seq[:hist.decoders.nSeqs]
  633. block.async.seqSize = hist.decoders.seqSize
  634. }
  635. seqExecute <- block
  636. }
  637. close(seqExecute)
  638. }()
  639. var wg sync.WaitGroup
  640. wg.Add(1)
  641. // Async 3: Execute sequences...
  642. frameHistCache := d.frame.history.b
  643. go func() {
  644. var hist history
  645. var decodedFrame uint64
  646. var fcs uint64
  647. var hasErr bool
  648. for block := range seqExecute {
  649. out := decodeOutput{err: block.err, d: block}
  650. if block.err != nil || hasErr {
  651. hasErr = true
  652. output <- out
  653. continue
  654. }
  655. if block.async.newHist != nil {
  656. if debugDecoder {
  657. println("Async 2: new history")
  658. }
  659. hist.windowSize = block.async.newHist.windowSize
  660. hist.allocFrameBuffer = block.async.newHist.allocFrameBuffer
  661. if block.async.newHist.dict != nil {
  662. hist.setDict(block.async.newHist.dict)
  663. }
  664. if cap(hist.b) < hist.allocFrameBuffer {
  665. if cap(frameHistCache) >= hist.allocFrameBuffer {
  666. hist.b = frameHistCache
  667. } else {
  668. hist.b = make([]byte, 0, hist.allocFrameBuffer)
  669. println("Alloc history sized", hist.allocFrameBuffer)
  670. }
  671. }
  672. hist.b = hist.b[:0]
  673. fcs = block.async.fcs
  674. decodedFrame = 0
  675. }
  676. do := decodeOutput{err: block.err, d: block}
  677. switch block.Type {
  678. case blockTypeRLE:
  679. if debugDecoder {
  680. println("add rle block length:", block.RLESize)
  681. }
  682. if cap(block.dst) < int(block.RLESize) {
  683. if block.lowMem {
  684. block.dst = make([]byte, block.RLESize)
  685. } else {
  686. block.dst = make([]byte, maxBlockSize)
  687. }
  688. }
  689. block.dst = block.dst[:block.RLESize]
  690. v := block.data[0]
  691. for i := range block.dst {
  692. block.dst[i] = v
  693. }
  694. hist.append(block.dst)
  695. do.b = block.dst
  696. case blockTypeRaw:
  697. if debugDecoder {
  698. println("add raw block length:", len(block.data))
  699. }
  700. hist.append(block.data)
  701. do.b = block.data
  702. case blockTypeCompressed:
  703. if debugDecoder {
  704. println("execute with history length:", len(hist.b), "window:", hist.windowSize)
  705. }
  706. hist.decoders.seqSize = block.async.seqSize
  707. hist.decoders.literals = block.async.literals
  708. do.err = block.executeSequences(&hist)
  709. hasErr = do.err != nil
  710. if debugDecoder && hasErr {
  711. println("executeSequences returned:", do.err)
  712. }
  713. do.b = block.dst
  714. }
  715. if !hasErr {
  716. decodedFrame += uint64(len(do.b))
  717. if decodedFrame > fcs {
  718. println("fcs exceeded", block.Last, fcs, decodedFrame)
  719. do.err = ErrFrameSizeExceeded
  720. hasErr = true
  721. } else if block.Last && fcs != fcsUnknown && decodedFrame != fcs {
  722. do.err = ErrFrameSizeMismatch
  723. hasErr = true
  724. } else {
  725. if debugDecoder {
  726. println("fcs ok", block.Last, fcs, decodedFrame)
  727. }
  728. }
  729. }
  730. output <- do
  731. }
  732. close(output)
  733. frameHistCache = hist.b
  734. wg.Done()
  735. if debugDecoder {
  736. println("decoder goroutines finished")
  737. }
  738. }()
  739. decodeStream:
  740. for {
  741. var hist history
  742. var hasErr bool
  743. decodeBlock := func(block *blockDec) {
  744. if hasErr {
  745. if block != nil {
  746. seqDecode <- block
  747. }
  748. return
  749. }
  750. if block.err != nil || block.Type != blockTypeCompressed {
  751. hasErr = block.err != nil
  752. seqDecode <- block
  753. return
  754. }
  755. remain, err := block.decodeLiterals(block.data, &hist)
  756. block.err = err
  757. hasErr = block.err != nil
  758. if err == nil {
  759. block.async.literals = hist.decoders.literals
  760. block.async.seqData = remain
  761. } else if debugDecoder {
  762. println("decodeLiterals error:", err)
  763. }
  764. seqDecode <- block
  765. }
  766. frame := d.frame
  767. if debugDecoder {
  768. println("New frame...")
  769. }
  770. var historySent bool
  771. frame.history.reset()
  772. err := frame.reset(&br)
  773. if debugDecoder && err != nil {
  774. println("Frame decoder returned", err)
  775. }
  776. if err == nil && frame.DictionaryID != nil {
  777. dict, ok := d.dicts[*frame.DictionaryID]
  778. if !ok {
  779. err = ErrUnknownDictionary
  780. } else {
  781. frame.history.setDict(&dict)
  782. }
  783. }
  784. if err == nil && d.frame.WindowSize > d.o.maxWindowSize {
  785. err = ErrDecoderSizeExceeded
  786. }
  787. if err != nil {
  788. select {
  789. case <-ctx.Done():
  790. case dec := <-d.decoders:
  791. dec.sendErr(err)
  792. decodeBlock(dec)
  793. }
  794. break decodeStream
  795. }
  796. // Go through all blocks of the frame.
  797. for {
  798. var dec *blockDec
  799. select {
  800. case <-ctx.Done():
  801. break decodeStream
  802. case dec = <-d.decoders:
  803. // Once we have a decoder, we MUST return it.
  804. }
  805. err := frame.next(dec)
  806. if !historySent {
  807. h := frame.history
  808. if debugDecoder {
  809. println("Alloc History:", h.allocFrameBuffer)
  810. }
  811. hist.reset()
  812. if h.dict != nil {
  813. hist.setDict(h.dict)
  814. }
  815. dec.async.newHist = &h
  816. dec.async.fcs = frame.FrameContentSize
  817. historySent = true
  818. } else {
  819. dec.async.newHist = nil
  820. }
  821. if debugDecoder && err != nil {
  822. println("next block returned error:", err)
  823. }
  824. dec.err = err
  825. dec.checkCRC = nil
  826. if dec.Last && frame.HasCheckSum && err == nil {
  827. crc, err := frame.rawInput.readSmall(4)
  828. if err != nil {
  829. println("CRC missing?", err)
  830. dec.err = err
  831. }
  832. var tmp [4]byte
  833. copy(tmp[:], crc)
  834. dec.checkCRC = tmp[:]
  835. if debugDecoder {
  836. println("found crc to check:", dec.checkCRC)
  837. }
  838. }
  839. err = dec.err
  840. last := dec.Last
  841. decodeBlock(dec)
  842. if err != nil {
  843. break decodeStream
  844. }
  845. if last {
  846. break
  847. }
  848. }
  849. }
  850. close(seqDecode)
  851. wg.Wait()
  852. d.frame.history.b = frameHistCache
  853. }