mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-09-17 13:50:27 +00:00
54 lines
2.0 KiB
Go
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)
|
|
})
|
|
}
|
|
}
|