[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