mirror of
https://github.com/openssl/openssl.git
synced 2026-10-28 16:36:02 +08:00
TLSProxy::Message::get_messages() kept a single set of reassembly buffers shared between the client and the server, even though DTLS legitimately allows each side to have its own in-flight, independently fragmented handshake message at the same time. When a peer switch happened while the other side's fragment was still incomplete (e.g. the client's fatal alert reaching the proxy before the server's second CertificateVerify datagram), the previous code discarded the buffered fragment to avoid a crash. That stops the die(), but the discarded bytes are unrecoverable: when the server's real second datagram arrives afterward, it is reparsed as the start of a brand new message instead of its continuation, and buffers forever waiting for a first half that will never arrive. In a live run that is indistinguishable from a hang until Proxy.pm's "no progress" counter trips, i.e. an intermittent, timing-dependent test failure rather than a clean crash. Give the client and server independent reassembly state instead, so a record from one peer can never observe or clobber the other peer's in-progress fragment. The special-cased "changed peer" discard/die branch is no longer needed and is removed. Assisted-by: Claude:claude-sonnet-5 Reviewed-by: Frederik Wedel-Heinen <fwh.openssl@gmail.com> Reviewed-by: Tomas Mraz <tomas@openssl.foundation> Merge-date: Mon Sep 21 09:41:08 2026 Merged-from: https://github.com/openssl/openssl/pull/32831