...
1 package pgproto3_test
2
3 import (
4 "bytes"
5 "testing"
6
7 "github.com/jackc/pgx/v5/internal/pgio"
8 "github.com/jackc/pgx/v5/pgproto3"
9 "github.com/stretchr/testify/require"
10 )
11
12 func FuzzFrontend(f *testing.F) {
13 testcases := []struct {
14 msgType byte
15 msgLen uint32
16 msgBody []byte
17 }{
18 {
19 msgType: 'Z',
20 msgLen: 2,
21 msgBody: []byte{'I'},
22 },
23 {
24 msgType: 'Z',
25 msgLen: 5,
26 msgBody: []byte{'I'},
27 },
28 }
29 for _, tc := range testcases {
30 f.Add(tc.msgType, tc.msgLen, tc.msgBody)
31 }
32 f.Fuzz(func(t *testing.T, msgType byte, msgLen uint32, msgBody []byte) {
33
34 if int(msgLen) > len(msgBody)+4 {
35 return
36 }
37
38
39 if msgLen > 128 || len(msgBody) > 128 {
40 return
41 }
42
43 r := &bytes.Buffer{}
44 w := &bytes.Buffer{}
45 fe := pgproto3.NewFrontend(r, w)
46
47 var encodedMsg []byte
48 encodedMsg = append(encodedMsg, msgType)
49 encodedMsg = pgio.AppendUint32(encodedMsg, msgLen)
50 encodedMsg = append(encodedMsg, msgBody...)
51 _, err := r.Write(encodedMsg)
52 require.NoError(t, err)
53
54
55 fe.Receive()
56 })
57 }
58
View as plain text