Clean up and fix X509V3_EXT_add1_i2d()
authortb <tb@openbsd.org>
Tue, 28 May 2024 15:40:38 +0000 (15:40 +0000)
committertb <tb@openbsd.org>
Tue, 28 May 2024 15:40:38 +0000 (15:40 +0000)
commit109033698bb3d50d841603ff801b5426aaa50c26
tree352f03e4f36eaf61f8567ecd3e3055707d1d1813
parent5f283da1a32464223c847b498f784027b86638ab
Clean up and fix X509V3_EXT_add1_i2d()

When looking at this code I noticed a few leaks. Fixing those leaks
was straightforward, but following the code was really hard.

This attempts to make the logic a bit clearer. In short, there are
6 mutually exclusive modes for this function (passed in the variable
aptly called flags). The default mode is to append the extension of
type nid and to error if such an extension already exists. Then there
are other modes with varying degree of madness.

The existing code didn't make X509V3_ADD_REPLACE explicit, which is
confusing. Operations 6-15 would all be treated like X509V3_ADD_REPLACE
due to the way the function was written. Handle the supported operations
via a switch and error for operations 6-15. This and the elimination
of leaks are the only changes of behavior, as validated by relatively
extensive test coverage.

ok jsing
lib/libcrypto/x509/x509_lib.c