Browse Source

Merge pull request #36728 from darrenstahlmsft/LayerLeak

Fix Windows layer leak when write fails
Anusha Ragunathan 7 years ago
parent
commit
a8260058e3
1 changed files with 11 additions and 11 deletions
  1. 11 11
      daemon/graphdriver/windows/windows.go

+ 11 - 11
daemon/graphdriver/windows/windows.go

@@ -779,7 +779,7 @@ func writeLayerReexec() {
 }
 }
 
 
 // writeLayer writes a layer from a tar file.
 // writeLayer writes a layer from a tar file.
-func writeLayer(layerData io.Reader, home string, id string, parentLayerPaths ...string) (int64, error) {
+func writeLayer(layerData io.Reader, home string, id string, parentLayerPaths ...string) (size int64, retErr error) {
 	err := winio.EnableProcessPrivileges([]string{winio.SeBackupPrivilege, winio.SeRestorePrivilege})
 	err := winio.EnableProcessPrivileges([]string{winio.SeBackupPrivilege, winio.SeRestorePrivilege})
 	if err != nil {
 	if err != nil {
 		return 0, err
 		return 0, err
@@ -804,17 +804,17 @@ func writeLayer(layerData io.Reader, home string, id string, parentLayerPaths ..
 		return 0, err
 		return 0, err
 	}
 	}
 
 
-	size, err := writeLayerFromTar(layerData, w, filepath.Join(home, id))
-	if err != nil {
-		return 0, err
-	}
-
-	err = w.Close()
-	if err != nil {
-		return 0, err
-	}
+	defer func() {
+		if err := w.Close(); err != nil {
+			// This error should not be discarded as a failure here
+			// could result in an invalid layer on disk
+			if retErr == nil {
+				retErr = err
+			}
+		}
+	}()
 
 
-	return size, nil
+	return writeLayerFromTar(layerData, w, filepath.Join(home, id))
 }
 }
 
 
 // resolveID computes the layerID information based on the given id.
 // resolveID computes the layerID information based on the given id.