@@ -24,12 +24,15 @@ import (
24
24
"path/filepath"
25
25
"strings"
26
26
27
+ "sync"
28
+ "sync/atomic"
29
+
27
30
"github.com/pkg/errors"
28
31
"github.com/sirupsen/logrus"
29
32
)
30
33
31
- // Map of target:linkname
32
- var hardlinks = make ( map [ string ] string )
34
+ // Thread safe Map of target:linkname
35
+ var hardlinks sync. Map
33
36
34
37
type OriginalPerm struct {
35
38
path string
@@ -134,19 +137,26 @@ func unpackTar(tr *tar.Reader, path string, whitelist []string) error {
134
137
// If it exists, create the hard link
135
138
resolveHardlink (linkname , target )
136
139
} else {
137
- hardlinks [ target ] = linkname
140
+ hardlinks . Store ( target , linkname )
138
141
}
139
142
}
140
143
}
141
-
142
- for target , linkname := range hardlinks {
144
+ var resolveError atomic.Value
145
+ hardlinks .Range (func (key , value interface {}) bool {
146
+ target := key .(string )
147
+ linkname := value .(string )
143
148
logrus .Info ("Resolving hard links" )
144
149
if _ , err := os .Stat (linkname ); ! os .IsNotExist (err ) {
145
150
// If it exists, create the hard link
146
151
if err := resolveHardlink (linkname , target ); err != nil {
147
- return errors .Wrap (err , fmt .Sprintf ("Unable to create hard link from %s to %s" , linkname , target ))
152
+ resolveError .Store (errors .Wrap (err , fmt .Sprintf ("Unable to create hard link from %s to %s" , linkname , target )))
153
+ return false
148
154
}
149
155
}
156
+ return true
157
+ })
158
+ if resolveError .Load () != nil {
159
+ return resolveError .Load ().(error )
150
160
}
151
161
152
162
// reset all original file
0 commit comments