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