aboutsummaryrefslogtreecommitdiffstats
path: root/modules/packages
diff options
context:
space:
mode:
authorKN4CK3R <admin@oldschoolhack.me>2023-07-24 16:19:44 +0200
committerGitHub <noreply@github.com>2023-07-24 16:19:44 +0200
commit6aa30af724b73c698b87c24fd5bb7d71b3c37abe (patch)
treeb0a94897d12d26cadf7df07e54e5057fec04aaa2 /modules/packages
parent4211efe8b7a0b38420da5c5d4f287a8d466aedc2 (diff)
downloadgitea-6aa30af724b73c698b87c24fd5bb7d71b3c37abe.tar.gz
gitea-6aa30af724b73c698b87c24fd5bb7d71b3c37abe.zip
Fix handling of Debian files with trailing slash (#26087)
Fixes #26022 - Fix handling of files with trailing slash - Fix handling of duplicate package file errors - Added test for both
Diffstat (limited to 'modules/packages')
-rw-r--r--modules/packages/debian/metadata.go4
-rw-r--r--modules/packages/debian/metadata_test.go110
2 files changed, 65 insertions, 49 deletions
diff --git a/modules/packages/debian/metadata.go b/modules/packages/debian/metadata.go
index dee524c8ff..bb77f7524b 100644
--- a/modules/packages/debian/metadata.go
+++ b/modules/packages/debian/metadata.go
@@ -80,7 +80,9 @@ func ParsePackage(r io.Reader) (*Package, error) {
if strings.HasPrefix(hd.Name, controlTar) {
var inner io.Reader
- switch hd.Name[len(controlTar):] {
+ // https://man7.org/linux/man-pages/man5/deb-split.5.html#FORMAT
+ // The file names might contain a trailing slash (since dpkg 1.15.6).
+ switch strings.TrimSuffix(hd.Name[len(controlTar):], "/") {
case "":
inner = arr
case ".gz":
diff --git a/modules/packages/debian/metadata_test.go b/modules/packages/debian/metadata_test.go
index 69fd51ea79..26c2a6fc68 100644
--- a/modules/packages/debian/metadata_test.go
+++ b/modules/packages/debian/metadata_test.go
@@ -69,57 +69,71 @@ func TestParsePackage(t *testing.T) {
tw.Write([]byte("Package: gitea\nVersion: 1.0.0\nArchitecture: amd64\n"))
tw.Close()
- t.Run("None", func(t *testing.T) {
- data := createArchive(map[string][]byte{"control.tar": buf.Bytes()})
-
- p, err := ParsePackage(data)
- assert.NotNil(t, p)
- assert.NoError(t, err)
- assert.Equal(t, "gitea", p.Name)
- })
-
- t.Run("gz", func(t *testing.T) {
- var zbuf bytes.Buffer
- zw := gzip.NewWriter(&zbuf)
- zw.Write(buf.Bytes())
- zw.Close()
-
- data := createArchive(map[string][]byte{"control.tar.gz": zbuf.Bytes()})
-
- p, err := ParsePackage(data)
- assert.NotNil(t, p)
- assert.NoError(t, err)
- assert.Equal(t, "gitea", p.Name)
- })
-
- t.Run("xz", func(t *testing.T) {
- var xbuf bytes.Buffer
- xw, _ := xz.NewWriter(&xbuf)
- xw.Write(buf.Bytes())
- xw.Close()
-
- data := createArchive(map[string][]byte{"control.tar.xz": xbuf.Bytes()})
-
- p, err := ParsePackage(data)
- assert.NotNil(t, p)
- assert.NoError(t, err)
- assert.Equal(t, "gitea", p.Name)
- })
+ cases := []struct {
+ Extension string
+ WriterFactory func(io.Writer) io.WriteCloser
+ }{
+ {
+ Extension: "",
+ WriterFactory: func(w io.Writer) io.WriteCloser {
+ return nopCloser{w}
+ },
+ },
+ {
+ Extension: ".gz",
+ WriterFactory: func(w io.Writer) io.WriteCloser {
+ return gzip.NewWriter(w)
+ },
+ },
+ {
+ Extension: ".xz",
+ WriterFactory: func(w io.Writer) io.WriteCloser {
+ xw, _ := xz.NewWriter(w)
+ return xw
+ },
+ },
+ {
+ Extension: ".zst",
+ WriterFactory: func(w io.Writer) io.WriteCloser {
+ zw, _ := zstd.NewWriter(w)
+ return zw
+ },
+ },
+ }
- t.Run("zst", func(t *testing.T) {
- var zbuf bytes.Buffer
- zw, _ := zstd.NewWriter(&zbuf)
- zw.Write(buf.Bytes())
- zw.Close()
+ for _, c := range cases {
+ t.Run(c.Extension, func(t *testing.T) {
+ var cbuf bytes.Buffer
+ w := c.WriterFactory(&cbuf)
+ w.Write(buf.Bytes())
+ w.Close()
+
+ data := createArchive(map[string][]byte{"control.tar" + c.Extension: cbuf.Bytes()})
+
+ p, err := ParsePackage(data)
+ assert.NotNil(t, p)
+ assert.NoError(t, err)
+ assert.Equal(t, "gitea", p.Name)
+
+ t.Run("TrailingSlash", func(t *testing.T) {
+ data := createArchive(map[string][]byte{"control.tar" + c.Extension + "/": cbuf.Bytes()})
+
+ p, err := ParsePackage(data)
+ assert.NotNil(t, p)
+ assert.NoError(t, err)
+ assert.Equal(t, "gitea", p.Name)
+ })
+ })
+ }
+ })
+}
- data := createArchive(map[string][]byte{"control.tar.zst": zbuf.Bytes()})
+type nopCloser struct {
+ io.Writer
+}
- p, err := ParsePackage(data)
- assert.NotNil(t, p)
- assert.NoError(t, err)
- assert.Equal(t, "gitea", p.Name)
- })
- })
+func (nopCloser) Close() error {
+ return nil
}
func TestParseControlFile(t *testing.T) {