From c71066252babee0f9e7006b6ced3672fd2bc8f37 Mon Sep 17 00:00:00 2001 From: Derek McGowan Date: Fri, 18 Aug 2017 15:22:31 -0700 Subject: [PATCH] Ensure content writer only unlocks resource once Make close a no-op after commit and disallow committing after close. Signed-off-by: Derek McGowan --- content/local/writer.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/content/local/writer.go b/content/local/writer.go index a7e6e25e4..b67aa63f8 100644 --- a/content/local/writer.go +++ b/content/local/writer.go @@ -55,6 +55,10 @@ func (w *writer) Write(p []byte) (n int, err error) { } func (w *writer) Commit(size int64, expected digest.Digest, opts ...content.Opt) error { + if w.fp == nil { + return errors.Wrap(errdefs.ErrFailedPrecondition, "cannot commit on closed writer") + } + if err := w.fp.Sync(); err != nil { return errors.Wrap(err, "sync failed") } @@ -115,8 +119,8 @@ func (w *writer) Commit(size int64, expected digest.Digest, opts ...content.Opt) return err } - unlock(w.ref) w.fp = nil + unlock(w.ref) return nil } @@ -130,12 +134,13 @@ func (w *writer) Commit(size int64, expected digest.Digest, opts ...content.Opt) // // To abandon a transaction completely, first call close then `Store.Remove` to // clean up the associated resources. -func (cw *writer) Close() (err error) { - unlock(cw.ref) - - if cw.fp != nil { - cw.fp.Sync() - return cw.fp.Close() +func (w *writer) Close() (err error) { + if w.fp != nil { + w.fp.Sync() + err = w.fp.Close() + w.fp = nil + unlock(w.ref) + return } return nil