"errors"
"fmt"
"reflect"
+ "runtime"
"strconv"
"strings"
)
textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
)
-const maxUnmarshalDepth = 10000
+const (
+ maxUnmarshalDepth = 10000
+ maxUnmarshalDepthWasm = 5000 // go.dev/issue/56498
+)
-var errExeceededMaxUnmarshalDepth = errors.New("exceeded max depth")
+var errUnmarshalDepth = errors.New("exceeded max depth")
// Unmarshal a single XML element into val.
func (d *Decoder) unmarshal(val reflect.Value, start *StartElement, depth int) error {
- if depth >= maxUnmarshalDepth {
- return errExeceededMaxUnmarshalDepth
+ if depth >= maxUnmarshalDepth || runtime.GOARCH == "wasm" && depth >= maxUnmarshalDepthWasm {
+ return errUnmarshalDepth
}
// Find start element if we need it.
if start == nil {
"errors"
"io"
"reflect"
+ "runtime"
"strings"
"testing"
"time"
err := Unmarshal(bytes.Repeat([]byte("<a>"), maxUnmarshalDepth+1), &n)
if err == nil {
t.Fatal("Unmarshal did not fail")
- } else if !errors.Is(err, errExeceededMaxUnmarshalDepth) {
- t.Fatalf("Unmarshal unexpected error: got %q, want %q", err, errExeceededMaxUnmarshalDepth)
+ } else if !errors.Is(err, errUnmarshalDepth) {
+ t.Fatalf("Unmarshal unexpected error: got %q, want %q", err, errUnmarshalDepth)
}
}
func TestCVE202230633(t *testing.T) {
- if testing.Short() {
+ if testing.Short() || runtime.GOARCH == "wasm" {
t.Skip("test requires significant memory")
}
defer func() {