fuzz: avoid FuzzedSock::Recv() repeated errors with EAGAIN

If `recv(2)` returns an error (`-1`) and sets `errno` to a temporary
error like `EAGAIN` a proper application code is expected to retry the
operation.

If the fuzz data is exhausted, then `FuzzedSock::Recv()` will keep
returning `-1` and setting `errno` to the first element of
`recv_errnos[]` which happened to be `EAGAIN`. This may continue forever
or cause the fuzz test to run for a long time before some higher level
application "receive timeout" is triggered.

Thus, put `ECONNREFUSED` as first element of `recv_errnos[]`.
This commit is contained in:
Vasil Dimov 2021-03-08 11:42:24 +01:00
parent 3088f83d01
commit 5a887d49b2
No known key found for this signature in database
GPG key ID: 54DF06F64B55CBBF

View file

@ -622,10 +622,13 @@ public:
ssize_t Recv(void* buf, size_t len, int flags) const override
{
// Have a permanent error at recv_errnos[0] because when the fuzzed data is exhausted
// SetFuzzedErrNo() will always return the first element and we want to avoid Recv()
// returning -1 and setting errno to EAGAIN repeatedly.
constexpr std::array recv_errnos{
ECONNREFUSED,
EAGAIN,
EBADF,
ECONNREFUSED,
EFAULT,
EINTR,
EINVAL,