aboutsummaryrefslogtreecommitdiff
path: root/src/test/fuzz/util.h
diff options
context:
space:
mode:
authorVasil Dimov <vd@FreeBSD.org>2021-03-08 11:42:24 +0100
committerVasil Dimov <vd@FreeBSD.org>2021-03-16 13:53:26 +0100
commit5a887d49b2b39e59d7cce8e9d5b89c21ad694f8b (patch)
treef2150d6983ae652da621ed6ef2b396838ca5be45 /src/test/fuzz/util.h
parent3088f83d016e7ebb6e6aa559e6326fa0ef0d6282 (diff)
downloadbitcoin-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/util.h')
-rw-r--r--src/test/fuzz/util.h5
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,