MCPcopy
hub / github.com/klauspost/compress / runDecoder

Method runDecoder

zstd/framedec.go:330–412  ·  view source on GitHub ↗

runDecoder will run the decoder for the remainder of the frame.

(dst []byte, dec *blockDec)

Source from the content-addressed store, hash-verified

328
329// runDecoder will run the decoder for the remainder of the frame.
330func (d *frameDec) runDecoder(dst []byte, dec *blockDec) ([]byte, error) {
331 saved := d.history.b
332
333 // We use the history for output to avoid copying it.
334 d.history.b = dst
335 d.history.ignoreBuffer = len(dst)
336 // Store input length, so we only check new data.
337 crcStart := len(dst)
338 d.history.decoders.maxSyncLen = 0
339 if d.o.limitToCap {
340 d.history.decoders.maxSyncLen = uint64(cap(dst) - len(dst))
341 }
342 if d.FrameContentSize != fcsUnknown {
343 if !d.o.limitToCap || d.FrameContentSize+uint64(len(dst)) < d.history.decoders.maxSyncLen {
344 d.history.decoders.maxSyncLen = d.FrameContentSize + uint64(len(dst))
345 }
346 if d.history.decoders.maxSyncLen > d.o.maxDecodedSize {
347 if debugDecoder {
348 println("maxSyncLen:", d.history.decoders.maxSyncLen, "> maxDecodedSize:", d.o.maxDecodedSize)
349 }
350 return dst, ErrDecoderSizeExceeded
351 }
352 if debugDecoder {
353 println("maxSyncLen:", d.history.decoders.maxSyncLen)
354 }
355 if !d.o.limitToCap && uint64(cap(dst)) < d.history.decoders.maxSyncLen {
356 // Alloc for output
357 dst2 := make([]byte, len(dst), d.history.decoders.maxSyncLen+compressedBlockOverAlloc)
358 copy(dst2, dst)
359 dst = dst2
360 }
361 }
362 var err error
363 for {
364 err = dec.reset(d.rawInput, d.WindowSize)
365 if err != nil {
366 break
367 }
368 if debugDecoder {
369 println("next block:", dec)
370 }
371 err = dec.decodeBuf(&d.history)
372 if err != nil {
373 break
374 }
375 if uint64(len(d.history.b)-crcStart) > d.o.maxDecodedSize {
376 println("runDecoder: maxDecodedSize exceeded", uint64(len(d.history.b)-crcStart), ">", d.o.maxDecodedSize)
377 err = ErrDecoderSizeExceeded
378 break
379 }
380 if d.o.limitToCap && len(d.history.b) > cap(dst) {
381 println("runDecoder: cap exceeded", uint64(len(d.history.b)), ">", cap(dst))
382 err = ErrDecoderSizeExceeded
383 break
384 }
385 if uint64(len(d.history.b)-crcStart) > d.FrameContentSize {
386 println("runDecoder: FrameContentSize exceeded", uint64(len(d.history.b)-crcStart), ">", d.FrameContentSize)
387 err = ErrFrameSizeExceeded

Callers 1

DecodeAllMethod · 0.80

Calls 6

consumeCRCMethod · 0.95
checkCRCMethod · 0.95
printlnFunction · 0.85
decodeBufMethod · 0.80
WriteMethod · 0.65
resetMethod · 0.45

Tested by

no test coverage detected