BUG/MEDIUM: quic: don't blindly rely on unaligned accesses
There are several places where the QUIC low-level code performs unaligned
accesses by casting unaligned char* pointers to uint32_t, but this is
totally forbidden as it only works on machines that support unaligned
accesses, and either crashes on other ones (SPARC, MIPS), can result in
reading garbage (ARMv5) or be very slow due to the access being emulated
(RISC-V). We do have functions for this, such as read_u32() and write_u32()
that rely on the compiler's knowledge of the machine's capabilities to
either perform an unaligned access or do it one byte at a time.
This must be backported at least as far as 2.6. Some of the code moved a
few times since, so in order to figure the points that need to be fixed,
one may look for a forced pointer cast without having verified that either
the machine is compatible or that the pointer is aligned using this:
$ git grep 'uint[36][24]_t \*)'
Or build and run the code on a MIPS or SPARC and perform requests using
curl to see if they work or crash with a bus error. All the places fixed
in this commit were found thanks to an immediate crash on the first
request.
This was tagged medium because the affected archs are not the most common
ones where QUIC will be found these days.
(cherry picked from commit c499cd15c71cf3bac7edbb62fc9d60ff401cc5d2)
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
(cherry picked from commit ec61d2e8ef013555ac00b85fea9955e4343b5621)
[ad: content moved from src/quic_retry,quic_rx,quic_tx.c to quic_conn.h/.c]
Signed-off-by: Amaury Denoyelle <adenoyelle@haproxy.com>
3 files changed