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:
1 file changed
+4
-1
@@ -622,10 +622,13 @@ public:
|
|||||||
|
|
||||||
ssize_t Recv(void* buf, size_t len, int flags) const override
|
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{
|
constexpr std::array recv_errnos{
|
||||||
|
ECONNREFUSED,
|
||||||
EAGAIN,
|
EAGAIN,
|
||||||
EBADF,
|
EBADF,
|
||||||
ECONNREFUSED,
|
|
||||||
EFAULT,
|
EFAULT,
|
||||||
EINTR,
|
EINTR,
|
||||||
EINVAL,
|
EINVAL,
|
||||||
|
|||||||
Reference in new issue
Block a user