Browse code

layer: protect mountedLayer.references

Add a mutex to protect concurrent access to mountedLayer.references map.

Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
(cherry picked from commit f73b5cb4e8b9a23ad6700577840582d66017a733)
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Kir Kolyshkin authored on 2019/05/04 01:59:54
Showing 1 changed files
... ...
@@ -2,6 +2,7 @@ package layer // import "github.com/docker/docker/layer"
2 2
 
3 3
 import (
4 4
 	"io"
5
+	"sync"
5 6
 
6 7
 	"github.com/docker/docker/pkg/archive"
7 8
 	"github.com/docker/docker/pkg/containerfs"
... ...
@@ -15,6 +16,7 @@ type mountedLayer struct {
15 15
 	path       string
16 16
 	layerStore *layerStore
17 17
 
18
+	sync.Mutex
18 19
 	references map[RWLayer]*referencedRWLayer
19 20
 }
20 21
 
... ...
@@ -62,16 +64,24 @@ func (ml *mountedLayer) getReference() RWLayer {
62 62
 	ref := &referencedRWLayer{
63 63
 		mountedLayer: ml,
64 64
 	}
65
+	ml.Lock()
65 66
 	ml.references[ref] = ref
67
+	ml.Unlock()
66 68
 
67 69
 	return ref
68 70
 }
69 71
 
70 72
 func (ml *mountedLayer) hasReferences() bool {
71
-	return len(ml.references) > 0
73
+	ml.Lock()
74
+	ret := len(ml.references) > 0
75
+	ml.Unlock()
76
+
77
+	return ret
72 78
 }
73 79
 
74 80
 func (ml *mountedLayer) deleteReference(ref RWLayer) error {
81
+	ml.Lock()
82
+	defer ml.Unlock()
75 83
 	if _, ok := ml.references[ref]; !ok {
76 84
 		return ErrLayerNotRetained
77 85
 	}
... ...
@@ -81,7 +91,9 @@ func (ml *mountedLayer) deleteReference(ref RWLayer) error {
81 81
 
82 82
 func (ml *mountedLayer) retakeReference(r RWLayer) {
83 83
 	if ref, ok := r.(*referencedRWLayer); ok {
84
+		ml.Lock()
84 85
 		ml.references[ref] = ref
86
+		ml.Unlock()
85 87
 	}
86 88
 }
87 89