From 39e97a6754b8d17be42b39efdb3cafc25f730d47 Mon Sep 17 00:00:00 2001 From: stffabi Date: Fri, 22 Jun 2018 09:09:07 +0200 Subject: [PATCH] Decompress user-data if it is gzipped Fixes #2391 (cherry picked from commit 05c2a40aa575212b3c6f6c4c15ec199578db1d45) --- cmd/cloudinitsave/cloudinitsave.go | 15 +++++++++++++++ config/cloudinit/config/decode.go | 7 ++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/cmd/cloudinitsave/cloudinitsave.go b/cmd/cloudinitsave/cloudinitsave.go index d715c988..67525163 100644 --- a/cmd/cloudinitsave/cloudinitsave.go +++ b/cmd/cloudinitsave/cloudinitsave.go @@ -182,6 +182,11 @@ func fetchAndSave(ds datasource.Datasource) error { log.Errorf("Failed fetching user-data from datasource: %v", err) return err } + userDataBytes, err = decompressIfGzip(userDataBytes) + if err != nil { + log.Errorf("Failed decompressing user-data from datasource: %v", err) + return err + } log.Infof("Fetching meta-data from datasource of type %v", ds.Type()) metadata, err = ds.FetchMetadata() if err != nil { @@ -367,3 +372,13 @@ func composeToCloudConfig(bytes []byte) ([]byte, error) { }, }) } + +const gzipMagicBytes = "\x1f\x8b" + +func decompressIfGzip(userdataBytes []byte) ([]byte, error) { + if !bytes.HasPrefix(userdataBytes, []byte(gzipMagicBytes)) { + return userdataBytes, nil + } + + return config.DecompressGzip(userdataBytes) +} diff --git a/config/cloudinit/config/decode.go b/config/cloudinit/config/decode.go index f5847aa9..3c520e02 100644 --- a/config/cloudinit/config/decode.go +++ b/config/cloudinit/config/decode.go @@ -18,7 +18,12 @@ func DecodeBase64Content(content string) ([]byte, error) { } func DecodeGzipContent(content string) ([]byte, error) { - gzr, err := gzip.NewReader(bytes.NewReader([]byte(content))) + byteContent := []byte(content) + return DecompressGzip(byteContent) +} + +func DecompressGzip(content []byte) ([]byte, error) { + gzr, err := gzip.NewReader(bytes.NewReader(content)) if err != nil { return nil, fmt.Errorf("Unable to decode gzip: %q", err)