diff options
| author | tb <> | 2023-06-20 14:05:46 +0000 |
|---|---|---|
| committer | tb <> | 2023-06-20 14:05:46 +0000 |
| commit | e8ccdf253cfa0ff21ced6e923e65faaafc0f0e50 (patch) | |
| tree | 9c7178cba5b0888774913e389b25c805ca5747cd /src | |
| parent | 6b6b8b595460a702a94328314232c8cc0f254a13 (diff) | |
| download | openbsd-e8ccdf253cfa0ff21ced6e923e65faaafc0f0e50.tar.gz openbsd-e8ccdf253cfa0ff21ced6e923e65faaafc0f0e50.tar.bz2 openbsd-e8ccdf253cfa0ff21ced6e923e65faaafc0f0e50.zip | |
Clean up EVP_PKEY_CTX_meth_dup()
Explicitly check against NULL, replace malloc() plus manual zeroing with
calloc(). Use EVP_PKEY_up_ref() rather than handrolling it and use a more
normal error idiom.
There still seems to be a bug in here in that the ENGINE's refcount isn't
bumped, but that will be investigated and fixed separately.
ok jsing
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/evp/pmeth_lib.c | 41 |
1 files changed, 19 insertions, 22 deletions
diff --git a/src/lib/libcrypto/evp/pmeth_lib.c b/src/lib/libcrypto/evp/pmeth_lib.c index bec899cef1..480a36b9ed 100644 --- a/src/lib/libcrypto/evp/pmeth_lib.c +++ b/src/lib/libcrypto/evp/pmeth_lib.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: pmeth_lib.c,v 1.27 2022/12/26 07:18:52 jmc Exp $ */ | 1 | /* $OpenBSD: pmeth_lib.c,v 1.28 2023/06/20 14:05:46 tb Exp $ */ |
| 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL | 2 | /* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL |
| 3 | * project 2006. | 3 | * project 2006. |
| 4 | */ | 4 | */ |
| @@ -275,43 +275,40 @@ EVP_PKEY_CTX_new_id(int id, ENGINE *e) | |||
| 275 | EVP_PKEY_CTX * | 275 | EVP_PKEY_CTX * |
| 276 | EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx) | 276 | EVP_PKEY_CTX_dup(EVP_PKEY_CTX *pctx) |
| 277 | { | 277 | { |
| 278 | EVP_PKEY_CTX *rctx; | 278 | EVP_PKEY_CTX *rctx = NULL; |
| 279 | 279 | ||
| 280 | if (!pctx->pmeth || !pctx->pmeth->copy) | 280 | if (pctx->pmeth == NULL || pctx->pmeth->copy == NULL) |
| 281 | return NULL; | 281 | goto err; |
| 282 | #ifndef OPENSSL_NO_ENGINE | 282 | #ifndef OPENSSL_NO_ENGINE |
| 283 | /* Make sure it's safe to copy a pkey context using an ENGINE */ | 283 | /* Make sure it's safe to copy a pkey context using an ENGINE */ |
| 284 | if (pctx->engine && !ENGINE_init(pctx->engine)) { | 284 | if (pctx->engine != NULL && !ENGINE_init(pctx->engine)) { |
| 285 | EVPerror(ERR_R_ENGINE_LIB); | 285 | EVPerror(ERR_R_ENGINE_LIB); |
| 286 | return 0; | 286 | goto err; |
| 287 | } | 287 | } |
| 288 | #endif | 288 | #endif |
| 289 | rctx = malloc(sizeof(EVP_PKEY_CTX)); | 289 | if ((rctx = calloc(1, sizeof(*rctx))) == NULL) { |
| 290 | if (!rctx) | 290 | EVPerror(ERR_R_MALLOC_FAILURE); |
| 291 | return NULL; | 291 | goto err; |
| 292 | } | ||
| 292 | 293 | ||
| 293 | rctx->pmeth = pctx->pmeth; | 294 | rctx->pmeth = pctx->pmeth; |
| 294 | #ifndef OPENSSL_NO_ENGINE | 295 | #ifndef OPENSSL_NO_ENGINE |
| 295 | rctx->engine = pctx->engine; | 296 | rctx->engine = pctx->engine; |
| 296 | #endif | 297 | #endif |
| 297 | 298 | ||
| 298 | if (pctx->pkey) | 299 | if ((rctx->pkey = pctx->pkey) != NULL) |
| 299 | CRYPTO_add(&pctx->pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); | 300 | EVP_PKEY_up_ref(rctx->pkey); |
| 300 | 301 | if ((rctx->peerkey = pctx->peerkey) != NULL) | |
| 301 | rctx->pkey = pctx->pkey; | 302 | EVP_PKEY_up_ref(rctx->peerkey); |
| 302 | |||
| 303 | if (pctx->peerkey) | ||
| 304 | CRYPTO_add(&pctx->peerkey->references, 1, CRYPTO_LOCK_EVP_PKEY); | ||
| 305 | |||
| 306 | rctx->peerkey = pctx->peerkey; | ||
| 307 | 303 | ||
| 308 | rctx->data = NULL; | ||
| 309 | rctx->app_data = NULL; | ||
| 310 | rctx->operation = pctx->operation; | 304 | rctx->operation = pctx->operation; |
| 311 | 305 | ||
| 312 | if (pctx->pmeth->copy(rctx, pctx) > 0) | 306 | if (pctx->pmeth->copy(rctx, pctx) <= 0) |
| 313 | return rctx; | 307 | goto err; |
| 308 | |||
| 309 | return rctx; | ||
| 314 | 310 | ||
| 311 | err: | ||
| 315 | EVP_PKEY_CTX_free(rctx); | 312 | EVP_PKEY_CTX_free(rctx); |
| 316 | return NULL; | 313 | return NULL; |
| 317 | } | 314 | } |
