[lxc-devel] [lxd/master] Fix memory and fd leaks during backup restore

stgraber on Github lxc-bot at linuxcontainers.org
Mon Feb 4 19:03:02 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190204/1296e775/attachment.bin>
-------------- next part --------------
From 4d9aba3eba5559b8deaf9c9cbb35b566215ffed8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 4 Feb 2019 16:55:40 +0100
Subject: [PATCH 1/3] shared: Properly handle uncompressed tarballs
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 shared/archive_linux.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/shared/archive_linux.go b/shared/archive_linux.go
index c141936387..5c6aec830d 100644
--- a/shared/archive_linux.go
+++ b/shared/archive_linux.go
@@ -47,7 +47,7 @@ func DetectCompressionFile(f io.ReadSeeker) ([]string, string, []string, error)
 	case bytes.Equal(header[0:3], []byte{0x5d, 0x00, 0x00}):
 		return []string{"--lzma", "-xf"}, ".tar.lzma", []string{"lzma", "-d"}, nil
 	case bytes.Equal(header[257:262], []byte{'u', 's', 't', 'a', 'r'}):
-		return []string{"-xf"}, ".tar", []string{""}, nil
+		return []string{"-xf"}, ".tar", []string{}, nil
 	case bytes.Equal(header[0:4], []byte{'h', 's', 'q', 's'}):
 		return []string{""}, ".squashfs", nil, nil
 	default:

From f18362015da4fe468305a12036a7b624206b9ebe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 4 Feb 2019 17:14:43 +0100
Subject: [PATCH 2/3] lxd/backup: Don't waste memory during unpack
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Closes #5447

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/backup.go | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/lxd/backup.go b/lxd/backup.go
index e469a19429..4aace58f63 100644
--- a/lxd/backup.go
+++ b/lxd/backup.go
@@ -2,10 +2,10 @@ package main
 
 import (
 	"archive/tar"
-	"bytes"
 	"fmt"
 	"io"
 	"os"
+	"os/exec"
 	"path/filepath"
 	"strings"
 	"time"
@@ -175,14 +175,22 @@ func backupGetInfo(r io.ReadSeeker) (*backupInfo, error) {
 	}
 
 	if len(unpacker) > 0 {
-		var buf bytes.Buffer
+		cmd := exec.Command(unpacker[0], unpacker[1:]...)
+		cmd.Stdin = r
 
-		err := shared.RunCommandWithFds(r, &buf, unpacker[0], unpacker[1:]...)
+		stdout, err := cmd.StdoutPipe()
 		if err != nil {
 			return nil, err
 		}
+		defer stdout.Close()
 
-		tr = tar.NewReader(&buf)
+		err = cmd.Start()
+		if err != nil {
+			return nil, err
+		}
+		defer cmd.Wait()
+
+		tr = tar.NewReader(stdout)
 	} else {
 		tr = tar.NewReader(r)
 	}

From 9a2e7f95b40081668ea81b42f15ab2cab8c8a46c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 4 Feb 2019 16:52:31 +0100
Subject: [PATCH 3/3] lxd/backup: Fix fd leak
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/containers_post.go | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/lxd/containers_post.go b/lxd/containers_post.go
index 1ec8a6b3c6..b229c696a3 100644
--- a/lxd/containers_post.go
+++ b/lxd/containers_post.go
@@ -579,6 +579,7 @@ func createFromBackup(d *Daemon, project string, data io.Reader) Response {
 
 	_, err = io.Copy(f, data)
 	if err != nil {
+		f.Close()
 		return InternalError(err)
 	}
 
@@ -586,11 +587,14 @@ func createFromBackup(d *Daemon, project string, data io.Reader) Response {
 	f.Seek(0, 0)
 	bInfo, err := backupGetInfo(f)
 	if err != nil {
+		f.Close()
 		return BadRequest(err)
 	}
 	bInfo.Project = project
 
 	run := func(op *operation) error {
+		defer f.Close()
+
 		// Dump tarball to storage
 		f.Seek(0, 0)
 		err = containerCreateFromBackup(d.State(), *bInfo, f)


More information about the lxc-devel mailing list