From 2e92a84fa8dd9047434f8496eb30d9f4fec63eae Mon Sep 17 00:00:00 2001 From: Aaron Lehmann Date: Wed, 30 Mar 2016 19:34:51 -0700 Subject: [PATCH] Fix layer store Get locking Get was calling getReference without layerL held. This meant writes to the references map could race. Such races are dangerous because they can corrupt the map and crash the process. Fixes #21616 Fixes #21674 Signed-off-by: Aaron Lehmann (cherry picked from commit 0538981c31a714a4183e846a4b512deb7879cc29) --- layer/layer_store.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/layer/layer_store.go b/layer/layer_store.go index a05b4a38b952b555f3a8ef07bfc23ef1a9796ce6..73a1b34c9301637583099a30138c1baeeed374c1 100644 --- a/layer/layer_store.go +++ b/layer/layer_store.go @@ -334,7 +334,10 @@ func (ls *layerStore) get(l ChainID) *roLayer { } func (ls *layerStore) Get(l ChainID) (Layer, error) { - layer := ls.get(l) + ls.layerL.Lock() + defer ls.layerL.Unlock() + + layer := ls.getWithoutLock(l) if layer == nil { return nil, ErrLayerDoesNotExist }