summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorGiteabot <teabot@gitea.io>2023-07-24 10:56:13 -0400
committerGitHub <noreply@github.com>2023-07-24 14:56:13 +0000
commita424f6d4f8224ca7d5db1a27e1db46a5dc47f30b (patch)
tree3926a35a1c974f6a5ccca38b0d611287e68b10a7 /modules
parent59713541b60d52e38244a83c0bbc7d220439d55a (diff)
downloadgitea-a424f6d4f8224ca7d5db1a27e1db46a5dc47f30b.tar.gz
gitea-a424f6d4f8224ca7d5db1a27e1db46a5dc47f30b.zip
Fix handling of Debian files with trailing slash (#26087) (#26098)
Backport #26087 by @KN4CK3R Fixes #26022 - Fix handling of files with trailing slash - Fix handling of duplicate package file errors - Added test for both Co-authored-by: KN4CK3R <admin@oldschoolhack.me>
Diffstat (limited to 'modules')
-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) {