@@ -6,6 +6,7 @@ package zstd
66
77import (
88 "crypto/rand"
9+ "errors"
910 "fmt"
1011 "io"
1112 "math"
@@ -149,6 +150,9 @@ func (e *Encoder) ResetContentSize(w io.Writer, size int64) {
149150// and write CRC if requested.
150151func (e * Encoder ) Write (p []byte ) (n int , err error ) {
151152 s := & e .state
153+ if s .eofWritten {
154+ return 0 , ErrEncoderClosed
155+ }
152156 for len (p ) > 0 {
153157 if len (p )+ len (s .filling ) < e .o .blockSize {
154158 if e .o .crc {
@@ -288,6 +292,9 @@ func (e *Encoder) nextBlock(final bool) error {
288292 s .filling , s .current , s .previous = s .previous [:0 ], s .filling , s .current
289293 s .nInput += int64 (len (s .current ))
290294 s .wg .Add (1 )
295+ if final {
296+ s .eofWritten = true
297+ }
291298 go func (src []byte ) {
292299 if debugEncoder {
293300 println ("Adding block," , len (src ), "bytes, final:" , final )
@@ -303,9 +310,6 @@ func (e *Encoder) nextBlock(final bool) error {
303310 blk := enc .Block ()
304311 enc .Encode (blk , src )
305312 blk .last = final
306- if final {
307- s .eofWritten = true
308- }
309313 // Wait for pending writes.
310314 s .wWg .Wait ()
311315 if s .writeErr != nil {
@@ -401,12 +405,20 @@ func (e *Encoder) Flush() error {
401405 if len (s .filling ) > 0 {
402406 err := e .nextBlock (false )
403407 if err != nil {
408+ // Ignore Flush after Close.
409+ if errors .Is (s .err , ErrEncoderClosed ) {
410+ return nil
411+ }
404412 return err
405413 }
406414 }
407415 s .wg .Wait ()
408416 s .wWg .Wait ()
409417 if s .err != nil {
418+ // Ignore Flush after Close.
419+ if errors .Is (s .err , ErrEncoderClosed ) {
420+ return nil
421+ }
410422 return s .err
411423 }
412424 return s .writeErr
@@ -422,6 +434,9 @@ func (e *Encoder) Close() error {
422434 }
423435 err := e .nextBlock (true )
424436 if err != nil {
437+ if errors .Is (s .err , ErrEncoderClosed ) {
438+ return nil
439+ }
425440 return err
426441 }
427442 if s .frameContentSize > 0 {
@@ -459,6 +474,11 @@ func (e *Encoder) Close() error {
459474 }
460475 _ , s .err = s .w .Write (frame )
461476 }
477+ if s .err == nil {
478+ s .err = ErrEncoderClosed
479+ return nil
480+ }
481+
462482 return s .err
463483}
464484
0 commit comments