From 78c22c24b353d77fdab3e1616d9986a8ae95a7c2 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Mon, 16 Dec 2013 14:35:43 +0100 Subject: [PATCH] ApplyLayer: Fix TestLookupImage The TestLookupImage test seems to use a layer that contains /etc/postgres/postgres.conf, but not e.g. /etc/postgres. To handle this we ensure that the parent directory always exists, and if not we create it. --- archive/diff.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/archive/diff.go b/archive/diff.go index 18740fe571..87457f38c1 100644 --- a/archive/diff.go +++ b/archive/diff.go @@ -49,6 +49,23 @@ func ApplyLayer(dest string, layer Archive) error { return err } + // Normalize name, for safety and for a simple is-root check + hdr.Name = filepath.Clean(hdr.Name) + + if !strings.HasSuffix(hdr.Name, "/") { + // Not the root directory, ensure that the parent directory exists + // This happened in some tests where an image had a tarfile without any + // parent directories + parent := filepath.Dir(hdr.Name) + parentPath := filepath.Join(dest, parent) + if _, err := os.Lstat(parentPath); err != nil && os.IsNotExist(err) { + err = os.MkdirAll(parentPath, 600) + if err != nil { + return err + } + } + } + // Skip AUFS metadata dirs if strings.HasPrefix(hdr.Name, ".wh..wh.") { continue