The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/distrobuilder/pull/332

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===

From 4a449714dae975dc49ebe1db2c34b76c15a047d4 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.h...@canonical.com>
Date: Tue, 19 May 2020 11:38:00 +0200
Subject: [PATCH 1/2] shared: Handle multiple checksums

Gentoo provides multiple hashes (BLAKE2B and SHA512) for the same file.
Instead of failing on the first mismatch, we need to check all
checksums.

Signed-off-by: Thomas Hipp <thomas.h...@canonical.com>
---
 shared/net.go  | 27 ++++++++++++++++++---------
 shared/util.go | 23 ++++++++++++++++++-----
 2 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/shared/net.go b/shared/net.go
index 408425e..8ac9081 100644
--- a/shared/net.go
+++ b/shared/net.go
@@ -20,6 +20,7 @@ import (
 func DownloadHash(def DefinitionImage, file, checksum string, hashFunc 
hash.Hash) (string, error) {
        var (
                client http.Client
+               hashes []string
                hash   string
                err    error
        )
@@ -40,7 +41,7 @@ func DownloadHash(def DefinitionImage, file, checksum string, 
hashFunc hash.Hash
                        hashLen = hashFunc.Size() * 2
                }
 
-               hash, err = downloadChecksum(targetDir, checksum, file, 
hashFunc, hashLen)
+               hashes, err = downloadChecksum(targetDir, checksum, file, 
hashFunc, hashLen)
                if err != nil {
                        return "", errors.Wrap(err, "Error while downloading 
checksum")
                }
@@ -67,8 +68,16 @@ func DownloadHash(def DefinitionImage, file, checksum 
string, hashFunc hash.Hash
                        }
 
                        result := fmt.Sprintf("%x", hashFunc.Sum(nil))
-                       if result != hash {
-                               return "", fmt.Errorf("Hash mismatch for %s: %s 
!= %s", imagePath, result, hash)
+
+                       for _, h := range hashes {
+                               if result == h {
+                                       hash = h
+                                       break
+                               }
+                       }
+
+                       if hash == "" {
+                               return "", fmt.Errorf("Hash mismatch for %s: %s 
!= %v", imagePath, result, hashes)
                        }
                }
 
@@ -103,7 +112,7 @@ func DownloadHash(def DefinitionImage, file, checksum 
string, hashFunc hash.Hash
 
 // downloadChecksum downloads or opens URL, and matches fname against the
 // checksums inside of the downloaded or opened file.
-func downloadChecksum(targetDir string, URL string, fname string, hashFunc 
hash.Hash, hashLen int) (string, error) {
+func downloadChecksum(targetDir string, URL string, fname string, hashFunc 
hash.Hash, hashLen int) ([]string, error) {
        var (
                client   http.Client
                tempFile *os.File
@@ -115,29 +124,29 @@ func downloadChecksum(targetDir string, URL string, fname 
string, hashFunc hash.
        if err == nil && !fi.IsDir() {
                tempFile, err = os.Open(filepath.Join(targetDir, URL))
                if err != nil {
-                       return "", err
+                       return nil, err
                }
                defer os.Remove(tempFile.Name())
        } else {
                tempFile, err = ioutil.TempFile(targetDir, "hash.")
                if err != nil {
-                       return "", err
+                       return nil, err
                }
                defer os.Remove(tempFile.Name())
 
                _, err = lxd.DownloadFileHash(&client, "", nil, nil, "", URL, 
"", hashFunc, tempFile)
                // ignore hash mismatch
                if err != nil && !strings.HasPrefix(err.Error(), "Hash 
mismatch") {
-                       return "", err
+                       return nil, err
                }
        }
 
        tempFile.Seek(0, 0)
 
        checksum := getChecksum(filepath.Base(fname), hashLen, tempFile)
-       if checksum != "" {
+       if checksum != nil {
                return checksum, nil
        }
 
-       return "", fmt.Errorf("Could not find checksum")
+       return nil, fmt.Errorf("Could not find checksum")
 }
diff --git a/shared/util.go b/shared/util.go
index 2b66c9f..abaf4d0 100644
--- a/shared/util.go
+++ b/shared/util.go
@@ -368,10 +368,11 @@ func GetTargetDir(def DefinitionImage) string {
        return targetDir
 }
 
-func getChecksum(fname string, hashLen int, r io.Reader) string {
+func getChecksum(fname string, hashLen int, r io.Reader) []string {
        scanner := bufio.NewScanner(r)
 
        var matches []string
+       var result []string
 
        for scanner.Scan() {
                if !strings.Contains(scanner.Text(), fname) {
@@ -395,19 +396,27 @@ func getChecksum(fname string, hashLen int, r io.Reader) 
string {
                fields := strings.Split(m, " ")
 
                if strings.TrimSpace(fields[len(fields)-1]) == fname {
-                       return strings.TrimSpace(fields[0])
+                       result = append(result, strings.TrimSpace(fields[0]))
                }
        }
 
+       if len(result) > 0 {
+               return result
+       }
+
        // Check common checksum file (pattern: "<hash> <filename>") which 
contains the filename
        for _, m := range matches {
                fields := strings.Split(m, " ")
 
                if strings.Contains(strings.TrimSpace(fields[len(fields)-1]), 
fname) {
-                       return strings.TrimSpace(fields[0])
+                       result = append(result, strings.TrimSpace(fields[0]))
                }
        }
 
+       if len(result) > 0 {
+               return result
+       }
+
        // Special case: CentOS
        for _, m := range matches {
                for _, s := range strings.Split(m, " ") {
@@ -417,10 +426,14 @@ func getChecksum(fname string, hashLen int, r io.Reader) 
string {
                        }
 
                        if hashLen == 0 || hashLen == len(strings.TrimSpace(s)) 
{
-                               return s
+                               result = append(result, s)
                        }
                }
        }
 
-       return ""
+       if len(result) > 0 {
+               return result
+       }
+
+       return nil
 }

From 6547ece1aba4a264973e81e911ec9156984baec6 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.h...@canonical.com>
Date: Tue, 19 May 2020 11:47:27 +0200
Subject: [PATCH 2/2] shared/util_test: Update checksum test

Signed-off-by: Thomas Hipp <thomas.h...@canonical.com>
---
 shared/util_test.go | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/shared/util_test.go b/shared/util_test.go
index 635605d..1c4f7f3 100644
--- a/shared/util_test.go
+++ b/shared/util_test.go
@@ -225,7 +225,7 @@ func Test_getChecksum(t *testing.T) {
        tests := []struct {
                name string
                args args
-               want string
+               want []string
        }{
                {
                        "openwrt-x86-64-rootfs.tar.gz",
@@ -243,7 +243,7 @@ 
d99669ef301129e6ba59417ff41814dd02b4bdbe7254e2c8535de5eae35801ad *openwrt-sdk-x8
 3b961a97e3105e02e07c1aba7671186efe559ce0ac078c370d5082a7a6999dbe 
*openwrt-x86-64-generic-squashfs-rootfs.img.gz
 76cc26429a61a516d348735a8d62bf3885d9d37489f20789a77c879dcf8a1025 
*openwrt-x86-64-rootfs.tar.gz`),
                        },
-                       
"76cc26429a61a516d348735a8d62bf3885d9d37489f20789a77c879dcf8a1025",
+                       
[]string{"76cc26429a61a516d348735a8d62bf3885d9d37489f20789a77c879dcf8a1025"},
                },
                {
                        "stage3-ppc64le-20200414T103003Z.tar.xz",
@@ -259,7 +259,7 @@ 
e4b9cb10146502310cbedf14197afa9e94b75f7d59c1c6977bff23bac529e9114e3fddb155cfcad9
 # SHA512 HASH
 
1047f97cbb209fb22d372dffe4461722b5eaf936fc73546a8f036dc52a5d20433921d367288b28b3de5154cad1253b40d32233104c2be45732ebfa413bd9b09b
  stage3-ppc64le-20200414T103003Z.tar.xz.CONTENTS`),
                        },
-                       
"e4b9cb10146502310cbedf14197afa9e94b75f7d59c1c6977bff23bac529e9114e3fddb155cfcad9119e466a39f0fcd8d75354e5237da79c9289fe76ee77693d",
+                       
[]string{"e4b9cb10146502310cbedf14197afa9e94b75f7d59c1c6977bff23bac529e9114e3fddb155cfcad9119e466a39f0fcd8d75354e5237da79c9289fe76ee77693d"},
                },
                {
                        "CentOS-8-x86_64-1905-dvd1.iso",
@@ -291,7 +291,7 @@ RP3G/3Z1T3c=
 =HgZm
 -----END PGP SIGNATURE-----`),
                        },
-                       
"ea17ef71e0df3f6bf1d4bf1fc25bec1a76d1f211c115d39618fe688be34503e8",
+                       
[]string{"ea17ef71e0df3f6bf1d4bf1fc25bec1a76d1f211c115d39618fe688be34503e8"},
                },
 
                {
@@ -326,7 +326,26 @@ Z4iksZrx82g=
 =L746
 -----END PGP SIGNATURE-----`),
                        },
-                       
"9a2c47d97b9975452f7d582264e9fc16d108ed8252ac6816239a3b58cef5c53d",
+                       
[]string{"9a2c47d97b9975452f7d582264e9fc16d108ed8252ac6816239a3b58cef5c53d"},
+               },
+               {
+                       "stage3-ppc-20200518T100528Z.tar.xz",
+                       args{
+                               "stage3-ppc-20200518T100528Z.tar.xz",
+                               128,
+                               bytes.NewBufferString(`# BLAKE2B HASH
+                               
6298bdc913c83190f6aa5f7399f05f2f1a20b1997479f033a261fa2e8347fd7cee67900a761c47b7c1c8370127e58016dd90d58f2f37b7f0d5e16722ba0650d2
  stage3-ppc-20200518T100528Z.tar.xz
+                               # SHA512 HASH
+                               
2d0183b8151e4560c317c2903c330f9fbfe2cc37c02ee100a60c9f42253e3ac3ef6db341c177a5e7594131bdcbdebfabe73217c0d4dc86e4dc4d1ce59ad5fbe7
  stage3-ppc-20200518T100528Z.tar.xz
+                               # BLAKE2B HASH
+                               
f8aeda7504be4a1374cbd837703138880baf70f8b256ee9f1f2f90cea0b669de62b14112afd2302ff03b6b410cd84f7434a79af3cb197c896a8279ca3068cdfe
  stage3-ppc-20200518T100528Z.tar.xz.CONTENTS.gz
+                               # SHA512 HASH
+                               
3a7dede7bcb68a0a32310d1bfbdd8806a17a1720be30907a17673f5f303dee340f5ad9c99d25738fb6f65b5ec224786b7d6b3ecbd5f37185469fbf33ea4c8c92
  stage3-ppc-20200518T100528Z.tar.xz.CONTENTS.gz`),
+                       },
+                       []string{
+                               
"6298bdc913c83190f6aa5f7399f05f2f1a20b1997479f033a261fa2e8347fd7cee67900a761c47b7c1c8370127e58016dd90d58f2f37b7f0d5e16722ba0650d2",
+                               
"2d0183b8151e4560c317c2903c330f9fbfe2cc37c02ee100a60c9f42253e3ac3ef6db341c177a5e7594131bdcbdebfabe73217c0d4dc86e4dc4d1ce59ad5fbe7",
+                       },
                },
        }
 
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to