Skip to content

Commit 3862b31

Browse files
authored
Fix RPM resource leak (#31794)
Fixes a resource leak introduced by #27069. - add defer - move sign code out of `repository.go`
1 parent de2787a commit 3862b31

File tree

3 files changed

+44
-36
lines changed

3 files changed

+44
-36
lines changed

routers/api/packages/rpm/rpm.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,19 +133,20 @@ func UploadPackageFile(ctx *context.Context) {
133133
}
134134
defer buf.Close()
135135

136-
// if rpm sign enabled
137136
if setting.Packages.DefaultRPMSignEnabled || ctx.FormBool("sign") {
138-
pri, _, err := rpm_service.GetOrCreateKeyPair(ctx, ctx.Package.Owner.ID)
137+
priv, _, err := rpm_service.GetOrCreateKeyPair(ctx, ctx.Package.Owner.ID)
139138
if err != nil {
140139
apiError(ctx, http.StatusInternalServerError, err)
141140
return
142141
}
143-
buf, err = rpm_service.SignPackage(buf, pri)
142+
signedBuf, err := rpm_service.SignPackage(buf, priv)
144143
if err != nil {
145-
// Not in rpm format, parsing failed.
146144
apiError(ctx, http.StatusBadRequest, err)
147145
return
148146
}
147+
defer signedBuf.Close()
148+
149+
buf = signedBuf
149150
}
150151

151152
pck, err := rpm_module.ParsePackage(buf)

services/packages/rpm/repository.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
rpm_model "code.gitea.io/gitea/models/packages/rpm"
2222
user_model "code.gitea.io/gitea/models/user"
2323
"code.gitea.io/gitea/modules/json"
24-
"code.gitea.io/gitea/modules/log"
2524
packages_module "code.gitea.io/gitea/modules/packages"
2625
rpm_module "code.gitea.io/gitea/modules/packages/rpm"
2726
"code.gitea.io/gitea/modules/util"
@@ -30,7 +29,6 @@ import (
3029
"github.com/ProtonMail/go-crypto/openpgp"
3130
"github.com/ProtonMail/go-crypto/openpgp/armor"
3231
"github.com/ProtonMail/go-crypto/openpgp/packet"
33-
"github.com/sassoftware/go-rpmutils"
3432
)
3533

3634
// GetOrCreateRepositoryVersion gets or creates the internal repository package
@@ -643,33 +641,3 @@ func addDataAsFileToRepo(ctx context.Context, pv *packages_model.PackageVersion,
643641
OpenSize: wc.Written(),
644642
}, nil
645643
}
646-
647-
func SignPackage(rpm *packages_module.HashedBuffer, privateKey string) (*packages_module.HashedBuffer, error) {
648-
keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewReader([]byte(privateKey)))
649-
if err != nil {
650-
// failed to parse key
651-
return nil, err
652-
}
653-
entity := keyring[0]
654-
h, err := rpmutils.SignRpmStream(rpm, entity.PrivateKey, nil)
655-
if err != nil {
656-
// error signing rpm
657-
return nil, err
658-
}
659-
signBlob, err := h.DumpSignatureHeader(false)
660-
if err != nil {
661-
// error writing sig header
662-
return nil, err
663-
}
664-
if len(signBlob)%8 != 0 {
665-
log.Info("incorrect padding: got %d bytes, expected a multiple of 8", len(signBlob))
666-
return nil, err
667-
}
668-
669-
// move fp to sign end
670-
if _, err := rpm.Seek(int64(h.OriginalSignatureHeaderSize()), io.SeekStart); err != nil {
671-
return nil, err
672-
}
673-
// create signed rpm buf
674-
return packages_module.CreateHashedBufferFromReader(io.MultiReader(bytes.NewReader(signBlob), rpm))
675-
}

services/packages/rpm/sign.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
// Copyright 2024 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package rpm
5+
6+
import (
7+
"bytes"
8+
"io"
9+
"strings"
10+
11+
packages_module "code.gitea.io/gitea/modules/packages"
12+
13+
"github.com/ProtonMail/go-crypto/openpgp"
14+
"github.com/sassoftware/go-rpmutils"
15+
)
16+
17+
func SignPackage(buf *packages_module.HashedBuffer, privateKey string) (*packages_module.HashedBuffer, error) {
18+
keyring, err := openpgp.ReadArmoredKeyRing(strings.NewReader(privateKey))
19+
if err != nil {
20+
return nil, err
21+
}
22+
23+
h, err := rpmutils.SignRpmStream(buf, keyring[0].PrivateKey, nil)
24+
if err != nil {
25+
return nil, err
26+
}
27+
28+
signBlob, err := h.DumpSignatureHeader(false)
29+
if err != nil {
30+
return nil, err
31+
}
32+
33+
if _, err := buf.Seek(int64(h.OriginalSignatureHeaderSize()), io.SeekStart); err != nil {
34+
return nil, err
35+
}
36+
37+
// create new buf with signature prefix
38+
return packages_module.CreateHashedBufferFromReader(io.MultiReader(bytes.NewReader(signBlob), buf))
39+
}

0 commit comments

Comments
 (0)