From: Frédéric Lécaille Date: Thu, 8 Sep 2022 18:38:59 +0000 (+0200) Subject: MINOR: dev/udp: Apply the corruption to both directions X-Git-Tag: v2.7-dev6~58 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=192093b58134304a0f3cbd50f96c06f51c023926;p=thirdparty%2Fhaproxy.git MINOR: dev/udp: Apply the corruption to both directions Harden the UDP datagram corruption applying it on both sides. This approaches the conditions of some tests run by the QUIC interop runner developed by Marten Seeman. --- diff --git a/dev/udp/udp-perturb.c b/dev/udp/udp-perturb.c index ca8c0dcd84..8a851fc49c 100644 --- a/dev/udp/udp-perturb.c +++ b/dev/udp/udp-perturb.c @@ -275,6 +275,18 @@ int add_connection(struct sockaddr_storage *ss) return -1; } +/* Corrupt buffer with as length if required */ +static void pktbuf_apply_corruption(char *buf, size_t buflen) +{ + if (corr_rate > 0 && prng(100) < corr_rate) { + unsigned int rnd = prng(corr_span * 256); // pos and value + unsigned int pos = corr_base + (rnd >> 8); + + if (pos < buflen) + buf[pos] ^= rnd; + } +} + /* Handle a read operation on an front FD. Will either reuse the existing * connection if the source is found, or will allocate a new one, possibly * replacing the oldest one. Returns <0 on error or the number of bytes @@ -323,13 +335,7 @@ int handle_frt(int fd, struct pollfd *pfd, struct conn *conns, int nbconn) if (ret < 0) return errno == EAGAIN ? 0 : -1; - if (corr_rate > 0 && prng(100) < corr_rate) { - unsigned int rnd = prng(corr_span * 256); // pos and value - unsigned int pos = corr_base + (rnd >> 8); - - if (pos < ret) - pktbuf[pos] ^= rnd; - } + pktbuf_apply_corruption(pktbuf, ret); conn = NULL; for (i = 0; i < nbconn; i++) { @@ -411,6 +417,8 @@ int handle_bck(int fd, struct pollfd *pfd, struct conn *conns, int nbconn) if (ret < 0) return errno == EAGAIN ? 0 : -1; + pktbuf_apply_corruption(pktbuf, ret); + conn = conn_bck_lookup(conns, nbconn, fd); if (!conn) return 0;