diff options
author | Vasil Dimov <vd@FreeBSD.org> | 2021-03-08 11:42:24 +0100 |
---|---|---|
committer | Vasil Dimov <vd@FreeBSD.org> | 2021-03-16 13:53:26 +0100 |
commit | 5a887d49b2b39e59d7cce8e9d5b89c21ad694f8b (patch) | |
tree | f2150d6983ae652da621ed6ef2b396838ca5be45 /src/test/fuzz | |
parent | 3088f83d016e7ebb6e6aa559e6326fa0ef0d6282 (diff) | |
download | bitcoin-5a887d49b2b39e59d7cce8e9d5b89c21ad694f8b.tar.xz |
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[]`.
Diffstat (limited to 'src/test/fuzz')
-rw-r--r-- | src/test/fuzz/util.h | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/src/test/fuzz/util.h b/src/test/fuzz/util.h index 4f44394d2b..db399abcf1 100644 --- a/src/test/fuzz/util.h +++ b/src/test/fuzz/util.h @@ -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, |