]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: quic: Possible unexpected counter incrementation on send*() errors
authorFrédéric Lécaille <flecaille@haproxy.com>
Thu, 9 Feb 2023 19:37:26 +0000 (20:37 +0100)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 17 Feb 2023 16:36:30 +0000 (17:36 +0100)
Some counters could potentially be incremented even if send*() syscall returned
no error when ret >= 0 and ret != sz. This could be the case for instance if
a first call to send*() returned -1 with errno set to EINTR (or any previous syscall
which set errno to a non-null value) and if the next call to send*() returned
something positive and smaller than <sz>.

Must be backported to 2.7 and 2.6.

src/quic_sock.c

index 068541f89b0f6bed6dc2417bb48fb8b292888a36..fd43859f3da45742dbbdec6ba8e624f73f7b956c 100644 (file)
@@ -609,7 +609,7 @@ int qc_snd_buf(struct quic_conn *qc, const struct buffer *buf, size_t sz,
                }
        } while (ret < 0 && errno == EINTR);
 
-       if (ret < 0 || ret != sz) {
+       if (ret < 0) {
                struct proxy *prx = qc->li->bind_conf->frontend;
                struct quic_counters *prx_counters =
                  EXTRA_COUNTERS_GET(prx->extra_counters_fe,
@@ -633,6 +633,9 @@ int qc_snd_buf(struct quic_conn *qc, const struct buffer *buf, size_t sz,
                return 1;
        }
 
+       if (ret != sz)
+               return 1;
+
        /* we count the total bytes sent, and the send rate for 32-byte blocks.
         * The reason for the latter is that freq_ctr are limited to 4GB and
         * that it's not enough per second.