diff --git a/internal/utils/extract.go b/internal/utils/extract.go index 92e31421..27cd7120 100644 --- a/internal/utils/extract.go +++ b/internal/utils/extract.go @@ -58,7 +58,7 @@ func ExtractTarGz(gzipStream io.Reader, destDir string, stripPathComponents int) switch header.Typeflag { case tar.TypeDir: d := filepath.Join(destDir, strippedName) - if err = os.Mkdir(filepath.Clean(d), 0o750); err != nil { + if err = os.MkdirAll(filepath.Clean(d), 0o750); err != nil { return nil, err } files = append(files, d) @@ -76,8 +76,22 @@ func ExtractTarGz(gzipStream io.Reader, destDir string, stripPathComponents int) if err = outFile.Close(); err != nil { return nil, err } + if err = os.Chmod(filepath.Clean(f), header.FileInfo().Mode()); err != nil { + return nil, err + } files = append(files, f) - + case tar.TypeLink, tar.TypeSymlink: + strippedSrcName := stripComponents(header.Linkname, stripPathComponents) + fDst := filepath.Join(destDir, strippedName) + if header.Typeflag == tar.TypeSymlink { + err = os.Symlink(filepath.Clean(strippedSrcName), filepath.Clean(fDst)) + } else { + err = os.Link(filepath.Clean(strippedSrcName), filepath.Clean(fDst)) + } + if err != nil { + return nil, err + } + files = append(files, fDst) default: return nil, fmt.Errorf("extractTarGz: uknown type: %b in %s", header.Typeflag, header.Name) } @@ -96,5 +110,5 @@ func stripComponents(headerName string, stripComponents int) string { if len(names) < stripComponents { return headerName } - return filepath.Clean(strings.Join(names[stripComponents:], "/")) + return filepath.Clean(strings.Join(names[stripComponents:], string(os.PathSeparator))) } diff --git a/pkg/driver/distro/cos.go b/pkg/driver/distro/cos.go index 1e99de23..3201d961 100644 --- a/pkg/driver/distro/cos.go +++ b/pkg/driver/distro/cos.go @@ -18,6 +18,7 @@ package driverdistro import ( "fmt" "os" + "path/filepath" "github.com/blang/semver" "github.com/falcosecurity/driverkit/pkg/kernelrelease" @@ -76,7 +77,7 @@ func (c *cos) customizeBuild(ctx context.Context, currKernelDir := env[kernelDirEnv] - cosKernelDir := currKernelDir + "usr/src/" + cosKernelDir := filepath.Join(currKernelDir, "usr", "src") entries, err := os.ReadDir(cosKernelDir) if err != nil { return nil, err @@ -84,7 +85,7 @@ func (c *cos) customizeBuild(ctx context.Context, if len(entries) == 0 { return nil, fmt.Errorf("no COS kernel src found") } - cosKernelDir = entries[0].Name() + cosKernelDir = filepath.Join(cosKernelDir, entries[0].Name()) // Override env key env[kernelDirEnv] = cosKernelDir diff --git a/pkg/driver/distro/distro.go b/pkg/driver/distro/distro.go index 17ac5bf8..d11f7203 100644 --- a/pkg/driver/distro/distro.go +++ b/pkg/driver/distro/distro.go @@ -17,7 +17,7 @@ package driverdistro import ( - "archive/tar" + "compress/gzip" "errors" "fmt" "io" @@ -336,12 +336,17 @@ func downloadKernelSrc(ctx context.Context, if err != nil { return nil, err } - var src io.Reader + var src io.ReadCloser if strings.HasSuffix(kernelConfigPath, ".gz") { - src = tar.NewReader(f) + src, err = gzip.NewReader(f) + if err != nil { + return env, err + } } else { src = f } + defer src.Close() + fStat, err := f.Stat() if err != nil { return nil, err diff --git a/pkg/driver/type/bpf.go b/pkg/driver/type/bpf.go index 5d976aba..e78ebe4b 100644 --- a/pkg/driver/type/bpf.go +++ b/pkg/driver/type/bpf.go @@ -87,6 +87,7 @@ func (b *bpf) Build(ctx context.Context, makeCmdArgs := fmt.Sprintf(`make -C %q`, filepath.Clean(srcPath)) makeCmd := exec.CommandContext(ctx, "bash", "-c", makeCmdArgs) //nolint:gosec // false positive // Append requested env variables to the command env + makeCmd.Env = os.Environ() for key, val := range env { makeCmd.Env = append(makeCmd.Env, fmt.Sprintf("%s=%s", key, val)) }