Files
sing-box-extended-mirror/common/srs/malformed_test.go
T

54 lines
2.0 KiB
Go

package srs
import (
"bytes"
"compress/zlib"
"encoding/binary"
"testing"
C "github.com/sagernet/sing-box/constant"
"github.com/stretchr/testify/require"
)
func craftRuleSet(body []byte) []byte {
var buffer bytes.Buffer
buffer.Write(MagicBytes[:])
buffer.WriteByte(C.RuleSetVersionCurrent)
compressWriter := zlib.NewWriter(&buffer)
compressWriter.Write(body)
compressWriter.Close()
return buffer.Bytes()
}
func uvarint(value uint64) []byte {
return binary.AppendUvarint(nil, value)
}
func TestReadMalformed(t *testing.T) {
t.Parallel()
defaultRule := []byte{0x00}
cases := []struct {
name string
body []byte
}{
{"huge_rule_count", uvarint(1 << 40)},
{"huge_string_count", bytes.Join([][]byte{uvarint(1), defaultRule, {ruleItemDomainKeyword}, uvarint(1 << 40)}, nil)},
{"huge_string_length", bytes.Join([][]byte{uvarint(1), defaultRule, {ruleItemDomainKeyword}, uvarint(1), uvarint(1 << 40)}, nil)},
{"huge_uint16_count", bytes.Join([][]byte{uvarint(1), defaultRule, {ruleItemQueryType}, uvarint(1 << 40)}, nil)},
{"huge_ip_range_count", bytes.Join([][]byte{uvarint(1), defaultRule, {ruleItemIPCIDR, 0x01}, binary.BigEndian.AppendUint64(nil, 1<<40)}, nil)},
{"bad_ip_range_address_length", bytes.Join([][]byte{uvarint(1), defaultRule, {ruleItemIPCIDR, 0x01}, binary.BigEndian.AppendUint64(nil, 1), uvarint(99)}, nil)},
{"huge_prefix_address_length", bytes.Join([][]byte{uvarint(1), defaultRule, {ruleItemDefaultInterfaceAddress}, uvarint(1), uvarint(1 << 40)}, nil)},
{"empty_domain_matcher", bytes.Join([][]byte{uvarint(1), defaultRule, {ruleItemDomain, 0x00}, uvarint(0), uvarint(0), uvarint(0)}, nil)},
{"huge_domain_matcher_bitmap", bytes.Join([][]byte{uvarint(1), defaultRule, {ruleItemDomain, 0x00}, uvarint(1 << 40)}, nil)},
{"deep_logical_nesting", bytes.Join([][]byte{uvarint(1), bytes.Repeat([]byte{0x01, 0x00, 0x01}, 10000)}, nil)},
}
for _, testCase := range cases {
t.Run(testCase.name, func(t *testing.T) {
t.Parallel()
_, err := Read(bytes.NewReader(craftRuleSet(testCase.body)), false)
require.Error(t, err)
})
}
}