Skip to content

Commit 372d24b

Browse files
authored
Limit reading bytes instead of ReadAll (#35928)
1 parent 2223be2 commit 372d24b

File tree

10 files changed

+64
-30
lines changed

10 files changed

+64
-30
lines changed

modules/actions/workflows.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ package actions
55

66
import (
77
"bytes"
8-
"io"
98
"slices"
109
"strings"
1110

1211
"code.gitea.io/gitea/modules/git"
1312
"code.gitea.io/gitea/modules/glob"
1413
"code.gitea.io/gitea/modules/log"
1514
api "code.gitea.io/gitea/modules/structs"
15+
"code.gitea.io/gitea/modules/util"
1616
webhook_module "code.gitea.io/gitea/modules/webhook"
1717

1818
"github.com/nektos/act/pkg/jobparser"
@@ -77,7 +77,7 @@ func GetContentFromEntry(entry *git.TreeEntry) ([]byte, error) {
7777
if err != nil {
7878
return nil, err
7979
}
80-
content, err := io.ReadAll(f)
80+
content, err := util.ReadWithLimit(f, 1024*1024)
8181
_ = f.Close()
8282
if err != nil {
8383
return nil, err

modules/issue/template/unmarshal.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package template
55

66
import (
77
"fmt"
8-
"io"
98
"path"
109
"strconv"
1110

@@ -76,7 +75,7 @@ func unmarshalFromEntry(entry *git.TreeEntry, filename string) (*api.IssueTempla
7675
}
7776
defer r.Close()
7877

79-
content, err := io.ReadAll(r)
78+
content, err := util.ReadWithLimit(r, 1024*1024)
8079
if err != nil {
8180
return nil, fmt.Errorf("read all: %w", err)
8281
}

modules/packages/nuget/metadata.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ func ParseNuspecMetaData(archive *zip.Reader, r io.Reader) (*Package, error) {
216216
if p.Metadata.Readme != "" {
217217
f, err := archive.Open(p.Metadata.Readme)
218218
if err == nil {
219-
buf, _ := io.ReadAll(f)
219+
buf, _ := util.ReadWithLimit(f, 1024*1024)
220220
m.Readme = string(buf)
221221
_ = f.Close()
222222
}

modules/packages/pub/metadata.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func ParsePackage(r io.Reader) (*Package, error) {
8989
return nil, err
9090
}
9191
} else if strings.EqualFold(hd.Name, "readme.md") {
92-
data, err := io.ReadAll(tr)
92+
data, err := util.ReadWithLimit(tr, 1024*1024)
9393
if err != nil {
9494
return nil, err
9595
}

modules/util/io.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func ReadAtMost(r io.Reader, buf []byte) (n int, err error) {
2929
// ReadWithLimit reads at most "limit" bytes from r into buf.
3030
// If EOF or ErrUnexpectedEOF occurs while reading, err will be nil.
3131
func ReadWithLimit(r io.Reader, n int) (buf []byte, err error) {
32-
return readWithLimit(r, 1024, n)
32+
return readWithLimit(r, 4*1024, n)
3333
}
3434

3535
func readWithLimit(r io.Reader, batch, limit int) ([]byte, error) {

routers/web/repo/wiki.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func wikiContentsByEntry(ctx *context.Context, entry *git.TreeEntry) []byte {
133133
return nil
134134
}
135135
defer reader.Close()
136-
content, err := io.ReadAll(reader)
136+
content, err := util.ReadWithLimit(reader, 5*1024*1024) // 5MB should be enough for a wiki page
137137
if err != nil {
138138
ctx.ServerError("ReadAll", err)
139139
return nil

services/issue/template.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ package issue
55

66
import (
77
"fmt"
8-
"io"
98
"net/url"
109
"path"
1110
"strings"
@@ -15,6 +14,7 @@ import (
1514
"code.gitea.io/gitea/modules/issue/template"
1615
"code.gitea.io/gitea/modules/log"
1716
api "code.gitea.io/gitea/modules/structs"
17+
"code.gitea.io/gitea/modules/util"
1818

1919
"gopkg.in/yaml.v3"
2020
)
@@ -65,7 +65,7 @@ func GetTemplateConfig(gitRepo *git.Repository, path string, commit *git.Commit)
6565

6666
defer reader.Close()
6767

68-
configContent, err := io.ReadAll(reader)
68+
configContent, err := util.ReadWithLimit(reader, 1024*1024)
6969
if err != nil {
7070
return GetDefaultTemplateConfig(), err
7171
}

services/repository/generate.go

Lines changed: 27 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ import (
77
"bufio"
88
"bytes"
99
"context"
10+
"errors"
1011
"fmt"
12+
"io/fs"
1113
"os"
1214
"path/filepath"
1315
"regexp"
@@ -138,31 +140,37 @@ func (gt *giteaTemplateFileMatcher) Match(s string) bool {
138140
return false
139141
}
140142

141-
func readGiteaTemplateFile(tmpDir string) (*giteaTemplateFileMatcher, error) {
142-
localPath := filepath.Join(tmpDir, ".gitea", "template")
143-
if _, err := os.Stat(localPath); os.IsNotExist(err) {
144-
return nil, nil
145-
} else if err != nil {
143+
func readLocalTmpRepoFileContent(localPath string, limit int) ([]byte, error) {
144+
ok, err := util.IsRegularFile(localPath)
145+
if err != nil {
146146
return nil, err
147+
} else if !ok {
148+
return nil, fs.ErrNotExist
147149
}
148150

149-
content, err := os.ReadFile(localPath)
151+
f, err := os.Open(localPath)
150152
if err != nil {
151153
return nil, err
152154
}
155+
defer f.Close()
156+
157+
return util.ReadWithLimit(f, limit)
158+
}
153159

160+
func readGiteaTemplateFile(tmpDir string) (*giteaTemplateFileMatcher, error) {
161+
localPath := filepath.Join(tmpDir, ".gitea", "template")
162+
content, err := readLocalTmpRepoFileContent(localPath, 1024*1024)
163+
if err != nil {
164+
return nil, err
165+
}
154166
return newGiteaTemplateFileMatcher(localPath, content), nil
155167
}
156168

157169
func substGiteaTemplateFile(ctx context.Context, tmpDir, tmpDirSubPath string, templateRepo, generateRepo *repo_model.Repository) error {
158170
tmpFullPath := filepath.Join(tmpDir, tmpDirSubPath)
159-
if ok, err := util.IsRegularFile(tmpFullPath); !ok {
160-
return err
161-
}
162-
163-
content, err := os.ReadFile(tmpFullPath)
171+
content, err := readLocalTmpRepoFileContent(tmpFullPath, 1024*1024)
164172
if err != nil {
165-
return err
173+
return util.Iif(errors.Is(err, fs.ErrNotExist), nil, err)
166174
}
167175
if err := util.Remove(tmpFullPath); err != nil {
168176
return err
@@ -172,7 +180,7 @@ func substGiteaTemplateFile(ctx context.Context, tmpDir, tmpDirSubPath string, t
172180
substSubPath := filepath.Clean(filePathSanitize(generateExpansion(ctx, tmpDirSubPath, templateRepo, generateRepo)))
173181
newLocalPath := filepath.Join(tmpDir, substSubPath)
174182
regular, err := util.IsRegularFile(newLocalPath)
175-
if canWrite := regular || os.IsNotExist(err); !canWrite {
183+
if canWrite := regular || errors.Is(err, fs.ErrNotExist); !canWrite {
176184
return nil
177185
}
178186
if err := os.MkdirAll(filepath.Dir(newLocalPath), 0o755); err != nil {
@@ -242,15 +250,15 @@ func generateRepoCommit(ctx context.Context, repo, templateRepo, generateRepo *r
242250

243251
// Variable expansion
244252
fileMatcher, err := readGiteaTemplateFile(tmpDir)
245-
if err != nil {
246-
return fmt.Errorf("readGiteaTemplateFile: %w", err)
247-
}
248-
249-
if fileMatcher != nil {
253+
if err == nil {
250254
err = processGiteaTemplateFile(ctx, tmpDir, templateRepo, generateRepo, fileMatcher)
251255
if err != nil {
252-
return err
256+
return fmt.Errorf("processGiteaTemplateFile: %w", err)
253257
}
258+
} else if errors.Is(err, fs.ErrNotExist) {
259+
log.Debug("skip processing repo template files: no available .gitea/template")
260+
} else {
261+
return fmt.Errorf("readGiteaTemplateFile: %w", err)
254262
}
255263

256264
if err = git.InitRepository(ctx, tmpDir, false, templateRepo.ObjectFormatName); err != nil {

services/repository/generate_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package repository
55

66
import (
7+
"io/fs"
78
"os"
89
"path/filepath"
910
"testing"
@@ -175,6 +176,31 @@ func TestProcessGiteaTemplateFile(t *testing.T) {
175176
// subst from a link, skip, and the target is unchanged
176177
assertSymLink("subst-${TEMPLATE_NAME}-from-link", tmpDir+"/sub/link-target")
177178
}
179+
180+
{
181+
templateFilePath := tmpDir + "/.gitea/template"
182+
183+
_ = os.Remove(templateFilePath)
184+
_, err := os.Lstat(templateFilePath)
185+
require.ErrorIs(t, err, fs.ErrNotExist)
186+
_, err = readGiteaTemplateFile(tmpDir) // no template file
187+
require.ErrorIs(t, err, fs.ErrNotExist)
188+
189+
_ = os.WriteFile(templateFilePath+".target", []byte("test-data-target"), 0o644)
190+
_ = os.Symlink(templateFilePath+".target", templateFilePath)
191+
content, _ := os.ReadFile(templateFilePath)
192+
require.Equal(t, "test-data-target", string(content))
193+
_, err = readGiteaTemplateFile(tmpDir) // symlinked template file
194+
require.ErrorIs(t, err, fs.ErrNotExist)
195+
196+
_ = os.Remove(templateFilePath)
197+
_ = os.WriteFile(templateFilePath, []byte("test-data-regular"), 0o644)
198+
content, _ = os.ReadFile(templateFilePath)
199+
require.Equal(t, "test-data-regular", string(content))
200+
fm, err := readGiteaTemplateFile(tmpDir) // regular template file
201+
require.NoError(t, err)
202+
assert.Len(t, fm.globs, 1)
203+
}
178204
}
179205

180206
func TestTransformers(t *testing.T) {

services/webhook/deliver.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import (
3030
"code.gitea.io/gitea/modules/queue"
3131
"code.gitea.io/gitea/modules/setting"
3232
"code.gitea.io/gitea/modules/timeutil"
33+
"code.gitea.io/gitea/modules/util"
3334
webhook_module "code.gitea.io/gitea/modules/webhook"
3435
)
3536

@@ -264,7 +265,7 @@ func Deliver(ctx context.Context, t *webhook_model.HookTask) error {
264265
t.ResponseInfo.Headers[k] = strings.Join(vals, ",")
265266
}
266267

267-
p, err := io.ReadAll(resp.Body)
268+
p, err := util.ReadWithLimit(resp.Body, 1024*1024)
268269
if err != nil {
269270
t.ResponseInfo.Body = fmt.Sprintf("read body: %s", err)
270271
return fmt.Errorf("unable to deliver webhook task[%d] in %s as unable to read response body: %w", t.ID, w.URL, err)

0 commit comments

Comments
 (0)