Browse Source

TarFilter: Fix leak of tmpfiles

We were leaking the temporary directory that we create in TarFilter,
because the "tmpDir, err := ioutil.TempDir()" call overrides the
tmpDir in the outer scope with a new locally scoped variable.
This means tmpDir is always "" when the cleanup function is called.

Also, we did not call the atExit() function if CmdStream had an
error early on.

On errors in CmdStream(),
Alexander Larsson 11 years ago
parent
commit
0aee096fd7
1 changed files with 11 additions and 1 deletions
  1. 11 1
      archive.go

+ 11 - 1
archive.go

@@ -120,7 +120,8 @@ func TarFilter(path string, compression Compression, filter []string, recursive
 	tmpDir := ""
 	tmpDir := ""
 
 
 	if createFiles != nil {
 	if createFiles != nil {
-		tmpDir, err := ioutil.TempDir("", "docker-tar")
+		var err error // Can't use := here or we override the outer tmpDir
+		tmpDir, err = ioutil.TempDir("", "docker-tar")
 		if err != nil {
 		if err != nil {
 			return nil, err
 			return nil, err
 		}
 		}
@@ -284,6 +285,9 @@ func CmdStream(cmd *exec.Cmd, input *string, atEnd func()) (io.Reader, error) {
 	if input != nil {
 	if input != nil {
 		stdin, err := cmd.StdinPipe()
 		stdin, err := cmd.StdinPipe()
 		if err != nil {
 		if err != nil {
+			if atEnd != nil {
+				atEnd()
+			}
 			return nil, err
 			return nil, err
 		}
 		}
 		// Write stdin if any
 		// Write stdin if any
@@ -294,10 +298,16 @@ func CmdStream(cmd *exec.Cmd, input *string, atEnd func()) (io.Reader, error) {
 	}
 	}
 	stdout, err := cmd.StdoutPipe()
 	stdout, err := cmd.StdoutPipe()
 	if err != nil {
 	if err != nil {
+		if atEnd != nil {
+			atEnd()
+		}
 		return nil, err
 		return nil, err
 	}
 	}
 	stderr, err := cmd.StderrPipe()
 	stderr, err := cmd.StderrPipe()
 	if err != nil {
 	if err != nil {
+		if atEnd != nil {
+			atEnd()
+		}
 		return nil, err
 		return nil, err
 	}
 	}
 	pipeR, pipeW := io.Pipe()
 	pipeR, pipeW := io.Pipe()