@@ -94,12 +94,20 @@ func (s *walkingDiff) Apply(ctx context.Context, desc ocispec.Descriptor, mounts
9494 if err != nil {
9595 return emptyDesc , errors .Wrap (err , "failed to create temporary directory" )
9696 }
97+ // We change RemoveAll to Remove so that we either leak a temp dir
98+ // if it fails but not RM snapshot data. refer to #1868 #1785
9799 defer os .Remove (dir )
98100
99101 if err := mount .All (mounts , dir ); err != nil {
100102 return emptyDesc , errors .Wrap (err , "failed to mount" )
101103 }
102- defer mount .Unmount (dir , 0 )
104+ defer func () {
105+ if uerr := mount .Unmount (dir , 0 ); uerr != nil {
106+ if err == nil {
107+ err = uerr
108+ }
109+ }
110+ }()
103111
104112 ra , err := s .store .ReaderAt (ctx , desc .Digest )
105113 if err != nil {
@@ -175,12 +183,24 @@ func (s *walkingDiff) DiffMounts(ctx context.Context, lower, upper []mount.Mount
175183 if err := mount .All (lower , aDir ); err != nil {
176184 return emptyDesc , errors .Wrap (err , "failed to mount" )
177185 }
178- defer mount .Unmount (aDir , 0 )
186+ defer func () {
187+ if uerr := mount .Unmount (aDir , 0 ); uerr != nil {
188+ if err == nil {
189+ err = uerr
190+ }
191+ }
192+ }()
179193
180194 if err := mount .All (upper , bDir ); err != nil {
181195 return emptyDesc , errors .Wrap (err , "failed to mount" )
182196 }
183- defer mount .Unmount (bDir , 0 )
197+ defer func () {
198+ if uerr := mount .Unmount (bDir , 0 ); uerr != nil {
199+ if err == nil {
200+ err = uerr
201+ }
202+ }
203+ }()
184204
185205 var newReference bool
186206 if config .Reference == "" {
0 commit comments