Skip to content

Commit 5218b87

Browse files
committed
fix: support bad utf8 chars in read
... not 500
1 parent 19ea23e commit 5218b87

2 files changed

Lines changed: 17 additions & 1 deletion

File tree

modules/packages/composer/metadata.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package composer
66
import (
77
"archive/tar"
88
"archive/zip"
9+
"bytes"
910
"compress/bzip2"
1011
"compress/gzip"
1112
"errors"
@@ -15,6 +16,7 @@ import (
1516
"regexp"
1617
"strings"
1718

19+
"gitea.dev/modules/charset"
1820
"gitea.dev/modules/json"
1921
"gitea.dev/modules/util"
2022
"gitea.dev/modules/validation"
@@ -273,7 +275,8 @@ func ParsePackage(r ReadSeekAt, optVersion ...string) (*PackageInfo, error) {
273275
if len(dataReadmeMd) == 0 {
274276
cj.Readme = ""
275277
} else {
276-
cj.Readme = string(dataReadmeMd)
278+
readmeContent := charset.ToUTF8WithFallback(dataReadmeMd, charset.ConvertOpts{ErrorReplacement: []byte{'?'}})
279+
cj.Readme = string(bytes.ToValidUTF8(readmeContent, []byte{'?'}))
277280
}
278281

279282
// FIXME: legacy format: strings.ToLower(fmt.Sprintf("%s.%s.zip", strings.ReplaceAll(cp.Name, "/", "-"), cp.Version)), doesn't read good

modules/packages/composer/metadata_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"io"
1212
"strings"
1313
"testing"
14+
"unicode/utf8"
1415

1516
"gitea.dev/modules/json"
1617

@@ -195,4 +196,16 @@ func TestParsePackage(t *testing.T) {
195196
}, map[string]string{"composer.json": buildComposerContent(""), "README.md": readme})
196197
assertValidPackage(t, data, "", "gitea-composer-package.tar.gz")
197198
})
199+
200+
t.Run("InvalidUTF8Readme", func(t *testing.T) {
201+
data := createArchive(map[string]string{"composer.json": buildComposerContent(""), "README.md": "readme\xffcontent"})
202+
203+
cp, err := ParsePackage(bytes.NewReader(data))
204+
require.NoError(t, err)
205+
require.NotNil(t, cp)
206+
207+
assert.True(t, utf8.ValidString(cp.Metadata.Readme))
208+
_, err = json.Marshal(cp.Metadata)
209+
assert.NoError(t, err)
210+
})
198211
}

0 commit comments

Comments
 (0)