Browse code

Fix Windows layer leak when write fails

Signed-off-by: Darren Stahl <darst@microsoft.com>

Darren Stahl authored on 2018/03/29 09:02:31
Showing 1 changed files
... ...
@@ -779,7 +779,7 @@ func writeLayerReexec() {
779 779
 }
780 780
 
781 781
 // writeLayer writes a layer from a tar file.
782
-func writeLayer(layerData io.Reader, home string, id string, parentLayerPaths ...string) (int64, error) {
782
+func writeLayer(layerData io.Reader, home string, id string, parentLayerPaths ...string) (size int64, retErr error) {
783 783
 	err := winio.EnableProcessPrivileges([]string{winio.SeBackupPrivilege, winio.SeRestorePrivilege})
784 784
 	if err != nil {
785 785
 		return 0, err
... ...
@@ -804,17 +804,17 @@ func writeLayer(layerData io.Reader, home string, id string, parentLayerPaths ..
804 804
 		return 0, err
805 805
 	}
806 806
 
807
-	size, err := writeLayerFromTar(layerData, w, filepath.Join(home, id))
808
-	if err != nil {
809
-		return 0, err
810
-	}
811
-
812
-	err = w.Close()
813
-	if err != nil {
814
-		return 0, err
815
-	}
807
+	defer func() {
808
+		if err := w.Close(); err != nil {
809
+			// This error should not be discarded as a failure here
810
+			// could result in an invalid layer on disk
811
+			if retErr == nil {
812
+				retErr = err
813
+			}
814
+		}
815
+	}()
816 816
 
817
-	return size, nil
817
+	return writeLayerFromTar(layerData, w, filepath.Join(home, id))
818 818
 }
819 819
 
820 820
 // resolveID computes the layerID information based on the given id.