From 78d7be4aebf7eced0e96618f0279f0b6f845c6f5 Mon Sep 17 00:00:00 2001 From: Sergio Lopez Date: Fri, 21 Dec 2018 09:30:09 +0100 Subject: [PATCH] layer/layer_store: ensure NewInputTarStream resources are released In applyTar, if the driver's ApplyDiff returns an error, the function returns early without calling io.Copy. As a consequence, the resources (a goroutine and some buffers holding the uncompressed image, the digest, etc...) allocated or referenced by NewInputTarStream above aren't released, as the worker goroutine only finishes when it finds EOF or a closed pipe. Signed-off-by: Sergio Lopez (cherry picked from commit 5846db10af9fb37061ab92a07c3d82fbea92b2e0) Signed-off-by: Sebastiaan van Stijn Upstream-commit: f660ef2c25590f21fdd10357c08a542a4876d6c3 Component: engine --- components/engine/layer/layer_store.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/components/engine/layer/layer_store.go b/components/engine/layer/layer_store.go index bc3e8719fc..1601465c04 100644 --- a/components/engine/layer/layer_store.go +++ b/components/engine/layer/layer_store.go @@ -253,13 +253,14 @@ func (ls *layerStore) applyTar(tx *fileMetadataTransaction, ts io.Reader, parent } applySize, err := ls.driver.ApplyDiff(layer.cacheID, parent, rdr) + // discard trailing data but ensure metadata is picked up to reconstruct stream + // unconditionally call io.Copy here before checking err to ensure the resources + // allocated by NewInputTarStream above are always released + io.Copy(ioutil.Discard, rdr) // ignore error as reader may be closed if err != nil { return err } - // Discard trailing data but ensure metadata is picked up to reconstruct stream - io.Copy(ioutil.Discard, rdr) // ignore error as reader may be closed - layer.size = applySize layer.diffID = DiffID(digester.Digest())