Improve the poorly designed BIO_set_next(3) API to always preserve all
authorschwarze <schwarze@openbsd.org>
Tue, 6 Dec 2022 16:10:55 +0000 (16:10 +0000)
committerschwarze <schwarze@openbsd.org>
Tue, 6 Dec 2022 16:10:55 +0000 (16:10 +0000)
commit0dc4ae8263195d1db55bebe0394f9fa5cb5cdfc2
tree28eca1d8e653a4988cb51ee59a396fe70530b66a
parent1a30e73692f1d3593a4a1a104ce9c1a7088eeeb7
Improve the poorly designed BIO_set_next(3) API to always preserve all
invariants of the prev_bio and next_bio fields of all BIO objects
in all involved chains, no matter which arguments this function is
called with.

Both real-world uses of this function (in libssl and freerdp) have
been audited to make sure this makes nothing worse.  We believe libssl
behaves correctly before and after the patch (mostly because the second
argument is NULL there), and we believe the code in freerdp behaves
incorrectly before and after the patch, leaving a prev_bio pointer in
place that is becoming bogus, only in a different object before and
after the patch.  But after the patch, that bogus pointer is due to a
separate bug in BIO_push(3), which we are planning to fix afterwards.

Joint work with and OK tb@.
lib/libcrypto/bio/bio_lib.c