@@ -80,7 +80,7 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
8080
8181 var ocidesc ocispec.Descriptor
8282 if err := mount .WithTempMount (ctx , lower , func (lowerRoot string ) error {
83- return mount .WithTempMount (ctx , upper , func (upperRoot string ) ( retErr error ) {
83+ return mount .WithTempMount (ctx , upper , func (upperRoot string ) error {
8484 var newReference bool
8585 if config .Reference == "" {
8686 newReference = true
@@ -95,8 +95,12 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
9595 if err != nil {
9696 return errors .Wrap (err , "failed to open writer" )
9797 }
98+
99+ // errOpen is set when an error occurs while the content writer has not been
100+ // committed or closed yet to force a cleanup
101+ var errOpen error
98102 defer func () {
99- if retErr != nil {
103+ if errOpen != nil {
100104 cw .Close ()
101105 if newReference {
102106 if abortErr := s .store .Abort (ctx , config .Reference ); abortErr != nil {
@@ -106,31 +110,31 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
106110 }
107111 }()
108112 if ! newReference {
109- if err = cw .Truncate (0 ); err != nil {
110- return err
113+ if errOpen = cw .Truncate (0 ); errOpen != nil {
114+ return errOpen
111115 }
112116 }
113117
114118 if isCompressed {
115119 dgstr := digest .SHA256 .Digester ()
116120 var compressed io.WriteCloser
117- compressed , err = compression .CompressStream (cw , compression .Gzip )
118- if err != nil {
119- return errors .Wrap (err , "failed to get compressed stream" )
121+ compressed , errOpen = compression .CompressStream (cw , compression .Gzip )
122+ if errOpen != nil {
123+ return errors .Wrap (errOpen , "failed to get compressed stream" )
120124 }
121- err = archive .WriteDiff (ctx , io .MultiWriter (compressed , dgstr .Hash ()), lowerRoot , upperRoot )
125+ errOpen = archive .WriteDiff (ctx , io .MultiWriter (compressed , dgstr .Hash ()), lowerRoot , upperRoot )
122126 compressed .Close ()
123- if err != nil {
124- return errors .Wrap (err , "failed to write compressed diff" )
127+ if errOpen != nil {
128+ return errors .Wrap (errOpen , "failed to write compressed diff" )
125129 }
126130
127131 if config .Labels == nil {
128132 config .Labels = map [string ]string {}
129133 }
130134 config .Labels [uncompressed ] = dgstr .Digest ().String ()
131135 } else {
132- if err = archive .WriteDiff (ctx , cw , lowerRoot , upperRoot ); err != nil {
133- return errors .Wrap (err , "failed to write diff" )
136+ if errOpen = archive .WriteDiff (ctx , cw , lowerRoot , upperRoot ); errOpen != nil {
137+ return errors .Wrap (errOpen , "failed to write diff" )
134138 }
135139 }
136140
@@ -140,10 +144,11 @@ func (s *walkingDiff) Compare(ctx context.Context, lower, upper []mount.Mount, o
140144 }
141145
142146 dgst := cw .Digest ()
143- if err : = cw .Commit (ctx , 0 , dgst , commitopts ... ); err != nil {
144- if ! errdefs .IsAlreadyExists (err ) {
145- return errors .Wrap (err , "failed to commit" )
147+ if errOpen = cw .Commit (ctx , 0 , dgst , commitopts ... ); errOpen != nil {
148+ if ! errdefs .IsAlreadyExists (errOpen ) {
149+ return errors .Wrap (errOpen , "failed to commit" )
146150 }
151+ errOpen = nil
147152 }
148153
149154 info , err := s .store .Info (ctx , dgst )
0 commit comments