diff --git a/src/knot/query/requestor.c b/src/knot/query/requestor.c
index 94c38489d5d2647796ba47072599ea012747d722..a2bf68902c6ebac5622f52160c73753623a3f83a 100644
--- a/src/knot/query/requestor.c
+++ b/src/knot/query/requestor.c
@@ -96,7 +96,9 @@ static int request_send(knot_request_t *request, int timeout_ms)
 	} else {
 		ret = net_dgram_send(request->fd, wire, wire_len, NULL);
 	}
-	if (ret != wire_len) {
+	if (ret < 0) {
+		return ret;
+	} else if (ret != wire_len) {
 		return KNOT_ECONN;
 	}
 
diff --git a/tests/knot/test_requestor.c b/tests/knot/test_requestor.c
index a1bdf1966da48ea9712fa6584772b66ae9282731..4226fc00d1dc02e8d9a01259a6a2ecb30e6a61c4 100644
--- a/tests/knot/test_requestor.c
+++ b/tests/knot/test_requestor.c
@@ -101,8 +101,8 @@ static void test_disconnected(knot_requestor_t *requestor,
 {
 	knot_request_t *req = make_query(requestor, dst, src);
 	int ret = knot_requestor_exec(requestor, req, TIMEOUT);
-	/* ECONNREFUSED is OK too on FreeBSD. */
-	ret = (ret == KNOT_ECONNREFUSED) ? KNOT_ECONN : ret;
+	/* ECONNREFUSED on FreeBSD, ETIMEOUT on NetBSD/OpenBSD/macOS. */
+	ret = (ret == KNOT_ECONNREFUSED || ret == KNOT_ETIMEOUT) ? KNOT_ECONN : ret;
 	is_int(KNOT_ECONN, ret, "requestor: disconnected/exec");
 	knot_request_free(req, requestor->mm);