From a360de27f3864e7c30b644752f9ceae69abb4dd1 Mon Sep 17 00:00:00 2001 From: Mikhail Khachayants Date: Mon, 5 Sep 2022 18:57:47 +0300 Subject: [PATCH] Fix data race between ReloadIfChanged and read-only usage of layerStore There was a race condition if a goroutine accessed to layerStore public methods under RO lock and at the same time ReloadIfChanged was called. In real life, it can occurr when there are two concurrent PlayKube requests in Podman. Signed-off-by: Mikhail Khachayants --- layers.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/layers.go b/layers.go index d24625a22..8929d0a40 100644 --- a/layers.go +++ b/layers.go @@ -423,6 +423,15 @@ func (r *layerStore) Load() error { } } + info, statErr := os.Stat(r.layerspath()) + if statErr != nil && !os.IsNotExist(statErr) { + return statErr + } + + if info != nil { + r.layerspathModified = info.ModTime() + } + return err } @@ -1924,7 +1933,6 @@ func (r *layerStore) Modified() (bool, error) { } if info != nil { tmodified = info.ModTime() != r.layerspathModified - r.layerspathModified = info.ModTime() } return tmodified, nil