Skip to content
This repository was archived by the owner on May 11, 2020. It is now read-only.

Commit 32f7a52

Browse files
laizysbinet
authored andcommitted
wasm: check names are valid utf-8 string (#153)
1 parent 4c85b4e commit 32f7a52

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

wasm/read.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ package wasm
77
import (
88
"bytes"
99
"encoding/binary"
10+
"errors"
1011
"io"
12+
"unicode/utf8"
1113

1214
"github.com/go-interpreter/wagon/wasm/leb128"
1315
)
@@ -22,7 +24,7 @@ func getInitialCap(count uint32) uint32 {
2224
return count
2325
}
2426

25-
func readBytes(r io.Reader, n int) ([]byte, error) {
27+
func readBytes(r io.Reader, n uint32) ([]byte, error) {
2628
if n == 0 {
2729
return nil, nil
2830
}
@@ -51,23 +53,26 @@ func readBytesUint(r io.Reader) ([]byte, error) {
5153
if err != nil {
5254
return nil, err
5355
}
54-
return readBytes(r, int(n))
56+
return readBytes(r, n)
5557
}
5658

57-
func readString(r io.Reader, n int) (string, error) {
59+
func readUTF8String(r io.Reader, n uint32) (string, error) {
5860
bytes, err := readBytes(r, n)
5961
if err != nil {
6062
return "", err
6163
}
64+
if !utf8.Valid(bytes) {
65+
return "", errors.New("wasm: invalid utf-8 string")
66+
}
6267
return string(bytes), nil
6368
}
6469

65-
func readStringUint(r io.Reader) (string, error) {
70+
func readUTF8StringUint(r io.Reader) (string, error) {
6671
n, err := leb128.ReadVarUint32(r)
6772
if err != nil {
6873
return "", err
6974
}
70-
return readString(r, int(n))
75+
return readUTF8String(r, n)
7176
}
7277

7378
func readU32(r io.Reader) (uint32, error) {

wasm/section.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func (s *SectionCustom) SectionID() SectionID {
259259

260260
func (s *SectionCustom) ReadPayload(r io.Reader) error {
261261
var err error
262-
s.Name, err = readStringUint(r)
262+
s.Name, err = readUTF8StringUint(r)
263263
if err != nil {
264264
return err
265265
}
@@ -366,11 +366,11 @@ func (s *SectionImports) WritePayload(w io.Writer) error {
366366

367367
func (i *ImportEntry) UnmarshalWASM(r io.Reader) error {
368368
var err error
369-
i.ModuleName, err = readStringUint(r)
369+
i.ModuleName, err = readUTF8StringUint(r)
370370
if err != nil {
371371
return err
372372
}
373-
i.FieldName, err = readStringUint(r)
373+
i.FieldName, err = readUTF8StringUint(r)
374374
if err != nil {
375375
return err
376376
}
@@ -684,7 +684,7 @@ type ExportEntry struct {
684684

685685
func (e *ExportEntry) UnmarshalWASM(r io.Reader) error {
686686
var err error
687-
e.FieldStr, err = readStringUint(r)
687+
e.FieldStr, err = readUTF8StringUint(r)
688688
if err != nil {
689689
return err
690690
}
@@ -879,7 +879,7 @@ func (f *FunctionBody) UnmarshalWASM(r io.Reader) error {
879879
return err
880880
}
881881

882-
body, err := readBytes(r, int(bodySize))
882+
body, err := readBytes(r, bodySize)
883883
if err != nil {
884884
return err
885885
}
@@ -1136,7 +1136,7 @@ func (*ModuleName) isNameSubsection() {}
11361136

11371137
func (s *ModuleName) UnmarshalWASM(r io.Reader) error {
11381138
var err error
1139-
s.Name, err = readStringUint(r)
1139+
s.Name, err = readUTF8StringUint(r)
11401140
return err
11411141
}
11421142

@@ -1226,7 +1226,7 @@ func (m NameMap) UnmarshalWASM(r io.Reader) error {
12261226
if err != nil {
12271227
return err
12281228
}
1229-
name, err := readStringUint(r)
1229+
name, err := readUTF8StringUint(r)
12301230
if err != nil {
12311231
return err
12321232
}

0 commit comments

Comments
 (0)