From d7f4d44d8e66e94ea3b9e3ddaa51e0cf534861ad Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Sun, 20 Apr 2025 23:06:26 +0530 Subject: [PATCH] More CodeQL fixes --- tools/utils/iso8601.go | 2 +- tools/utils/tar.go | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/utils/iso8601.go b/tools/utils/iso8601.go index 336f44cd0..7ff342427 100644 --- a/tools/utils/iso8601.go +++ b/tools/utils/iso8601.go @@ -115,7 +115,7 @@ func ISO8601Parse(raw string) (time.Time, error) { text = text[:9] } if text != "" { - if nsec, err = strconv.ParseInt(text, 10, 64); err != nil { + if nsec, err = strconv.ParseInt(text, 10, 0); err != nil { return errf("timestamp does not have a valid nanosecond field") } for ; extra > 0; extra-- { diff --git a/tools/utils/tar.go b/tools/utils/tar.go index c6e4a1a6b..75cee92c9 100644 --- a/tools/utils/tar.go +++ b/tools/utils/tar.go @@ -60,6 +60,16 @@ func ExtractAllFromTar(tr *tar.Reader, dest_path string, optss ...TarExtractOpti continue } dest = filepath.Join(dest_path, dest) + if dest, err = filepath.EvalSymlinks(dest); err != nil { + if os.IsNotExist(err) { + err = nil + } else { + return count, err + } + } + if !strings.HasPrefix(filepath.Clean(dest), filepath.Clean(dest_path)+string(os.PathSeparator)) { + return count, fmt.Errorf("illegal path in tar archive: %s", hdr.Name) + } switch hdr.Typeflag { case tar.TypeDir: err = os.MkdirAll(dest, 0o700) @@ -99,7 +109,15 @@ func ExtractAllFromTar(tr *tar.Reader, dest_path string, optss ...TarExtractOpti if err = os.MkdirAll(filepath.Dir(dest), 0o700); err != nil { return } - if err = os.Symlink(hdr.Linkname, dest); err != nil { + link_target := hdr.Linkname + if !filepath.IsAbs(link_target) { + link_target = filepath.Join(filepath.Dir(dest), link_target) + } + // Ensure the symlink target is within the destination directory + if !strings.HasPrefix(filepath.Clean(link_target), filepath.Clean(dest_path)+string(os.PathSeparator)) { + return count, fmt.Errorf("illegal symlink target: %s -> %s", hdr.Name, link_target) + } + if err = os.Symlink(link_target, dest); err != nil { return } if err = set_metadata(nil, hdr); err != nil {