From 66f06a85acb70f278c87cbe17ecb07b85d559f85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miloslav=20Trma=C4=8D?= Date: Tue, 8 Nov 2022 16:10:21 +0100 Subject: [PATCH] Fix locking of containerStore.BigDataDigest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It requires a WRITE lock. Signed-off-by: Miloslav Trmač --- containers.go | 1 + store.go | 16 +++++++--------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/containers.go b/containers.go index 3e0f4ddbc..7ec7e8acb 100644 --- a/containers.go +++ b/containers.go @@ -629,6 +629,7 @@ func (r *containerStore) BigDataSize(id, key string) (int64, error) { return -1, ErrSizeUnknown } +// Requires startWriting. Yes, really, WRITING (see SetBigData). func (r *containerStore) BigDataDigest(id, key string) (digest.Digest, error) { if key == "" { return "", fmt.Errorf("can't retrieve digest of container big data value with empty name: %w", ErrInvalidBigDataName) diff --git a/store.go b/store.go index f445957ac..0e4f9daf1 100644 --- a/store.go +++ b/store.go @@ -1968,15 +1968,13 @@ func (s *store) ContainerBigDataSize(id, key string) (int64, error) { } func (s *store) ContainerBigDataDigest(id, key string) (digest.Digest, error) { - rcstore, err := s.getContainerStore() - if err != nil { - return "", err - } - if err := rcstore.startReading(); err != nil { - return "", err - } - defer rcstore.stopReading() - return rcstore.BigDataDigest(id, key) + var res digest.Digest + err := s.writeToContainerStore(func(store rwContainerStore) error { // Yes, BigDataDigest requires a write lock. + var err error + res, err = store.BigDataDigest(id, key) + return err + }) + return res, err } func (s *store) ContainerBigData(id, key string) ([]byte, error) {