From 5e49ec27dc4ff4f619453578a624d8cc35b21630 Mon Sep 17 00:00:00 2001 From: AdamKorcz Date: Tue, 10 Aug 2021 12:48:33 +0100 Subject: [PATCH] Use http.Get to download binaries instead of exec.Command Signed-off-by: AdamKorcz --- contrib/fuzz/container_fuzzer.go | 51 ++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/contrib/fuzz/container_fuzzer.go b/contrib/fuzz/container_fuzzer.go index ed3fa9a6d..2433db677 100644 --- a/contrib/fuzz/container_fuzzer.go +++ b/contrib/fuzz/container_fuzzer.go @@ -32,6 +32,7 @@ import ( "github.com/containerd/containerd/sys" "io" "io/ioutil" + "net/http" "os" "os/exec" "strings" @@ -39,48 +40,60 @@ import ( ) var ( - haveInstalledWget = false haveDownloadedbinaries = false haveExtractedBinaries = false haveChangedPATH = false haveInitialized = false + + downloadLink = "https://github.com/containerd/containerd/releases/download/v1.5.4/containerd-1.5.4-linux-amd64.tar.gz" + downloadPath = "/tmp/containerd-1.5.4-linux-amd64.tar.gz" + binariesDir = "/tmp/containerd-binaries" ) +// downloadFile downloads a file from a url +func downloadFile(filepath string, url string) (err error) { + + out, err := os.Create(filepath) + if err != nil { + return err + } + defer out.Close() + + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + + _, err = io.Copy(out, resp.Body) + if err != nil { + return err + } + + return nil +} + // initInSteps() performs initialization in several steps // The reason for spreading the initialization out in // multiple steps is that each fuzz iteration can maximum // take 25 seconds when running through OSS-fuzz. // Should an iteration exceed that, then the fuzzer stops. func initInSteps() bool { - // Install wget - if !haveInstalledWget { - cmd := exec.Command("apt-get", "install", "-y", "wget") - err := cmd.Run() - if err != nil { - return true - } - haveInstalledWget = true - return true - } // Download binaries if !haveDownloadedbinaries { - tarLink := "https://github.com/containerd/containerd/releases/download/v1.5.4/containerd-1.5.4-linux-amd64.tar.gz" - cmd := exec.Command("wget", tarLink) - err := cmd.Run() + err := downloadFile(downloadPath, downloadLink) if err != nil { - return true + panic(err) } haveDownloadedbinaries = true - return true } // Extract binaries - binariesDir := "/tmp/containerd-binaries" if !haveExtractedBinaries { err := os.MkdirAll(binariesDir, 0777) if err != nil { return true } - cmd := exec.Command("tar", "xvf", "containerd-1.5.4-linux-amd64.tar.gz", "-C", binariesDir) + cmd := exec.Command("tar", "xvf", downloadPath, "-C", binariesDir) err = cmd.Run() if err != nil { return true @@ -91,7 +104,7 @@ func initInSteps() bool { // Add binaries to $PATH: if !haveChangedPATH { oldPathEnv := os.Getenv("PATH") - newPathEnv := fmt.Sprintf("%s:%s/bin", oldPathEnv, binariesDir) + newPathEnv := fmt.Sprintf("%s/bin:%s", binariesDir, oldPathEnv) err := os.Setenv("PATH", newPathEnv) if err != nil { return true