untrusted comment: verify with openbsd-75-base.pub RWRGj1pRpprAftVfUP/AVFEX44/5EmaEBZaDdN9E13hPf2Why5rsuciroMnEzxrDOHiHNMkmCsj51GpwCFc40GByi1n4p3LmawA= OpenBSD 7.5 errata 022, April 9, 2025: iked(8) and isakmpd(8) fix double-free in ecdh mode. Apply by doing: signify -Vep /etc/signify/openbsd-75-base.pub -x 022_ike.patch.sig \ -m - | (cd /usr/src && patch -p0) And then rebuild and install iked and isakmpd: cd /usr/src/sbin/iked make obj make make install cd /usr/src/sbin/isakmpd make obj make make install Index: sbin/iked/dh.c =================================================================== RCS file: /cvs/src/sbin/iked/dh.c,v diff -u -p -r1.33 dh.c --- sbin/iked/dh.c 28 Jul 2023 07:31:38 -0000 1.33 +++ sbin/iked/dh.c 25 Mar 2025 15:02:49 -0000 @@ -670,9 +670,9 @@ ec_raw2point(struct dh_group *group, uin { const EC_GROUP *ecgroup = NULL; EC_POINT *point = NULL; + EC_POINT *ret = NULL; BN_CTX *bnctx = NULL; BIGNUM *x = NULL, *y = NULL; - int ret = -1; size_t eclen; size_t xlen, ylen; @@ -700,10 +700,12 @@ ec_raw2point(struct dh_group *group, uin if (!EC_POINT_set_affine_coordinates(ecgroup, point, x, y, bnctx)) goto done; - ret = 0; + /* success */ + ret = point; + point = NULL; /* owned by caller */ + done: - if (ret != 0 && point != NULL) - EC_POINT_clear_free(point); + EC_POINT_clear_free(point); /* Make sure to erase sensitive data */ if (x != NULL) BN_clear(x); @@ -712,7 +714,7 @@ ec_raw2point(struct dh_group *group, uin BN_CTX_end(bnctx); BN_CTX_free(bnctx); - return (point); + return (ret); } int Index: sbin/isakmpd/dh.c =================================================================== RCS file: /cvs/src/sbin/isakmpd/dh.c,v diff -u -p -r1.27 dh.c --- sbin/isakmpd/dh.c 31 Mar 2023 07:28:46 -0000 1.27 +++ sbin/isakmpd/dh.c 25 Mar 2025 15:02:49 -0000 @@ -581,9 +581,9 @@ ec_raw2point(struct group *group, u_int8 { const EC_GROUP *ecgroup = NULL; EC_POINT *point = NULL; + EC_POINT *ret = NULL; BN_CTX *bnctx = NULL; BIGNUM *x = NULL, *y = NULL; - int ret = -1; size_t eclen; size_t xlen, ylen; @@ -611,10 +611,12 @@ ec_raw2point(struct group *group, u_int8 if (!EC_POINT_set_affine_coordinates(ecgroup, point, x, y, bnctx)) goto done; - ret = 0; + /* success */ + ret = point; + point = NULL; /* owned by caller */ + done: - if (ret != 0 && point != NULL) - EC_POINT_clear_free(point); + EC_POINT_clear_free(point); /* Make sure to erase sensitive data */ if (x != NULL) BN_clear(x); @@ -623,5 +625,5 @@ ec_raw2point(struct group *group, u_int8 BN_CTX_end(bnctx); BN_CTX_free(bnctx); - return (point); + return (ret); }