diff options
| author | bcook <> | 2018-08-05 11:19:25 +0000 |
|---|---|---|
| committer | bcook <> | 2018-08-05 11:19:25 +0000 |
| commit | 2e290efb0ac101817d9da88a5b417f1b48cbe3fa (patch) | |
| tree | e911b25c2f08ca2167e4945a2c833c2c818151a1 /src/lib/libcrypto/pem/pvkfmt.c | |
| parent | bc5000034af13f4c49c17dec36a14297930f86ae (diff) | |
| download | openbsd-2e290efb0ac101817d9da88a5b417f1b48cbe3fa.tar.gz openbsd-2e290efb0ac101817d9da88a5b417f1b48cbe3fa.tar.bz2 openbsd-2e290efb0ac101817d9da88a5b417f1b48cbe3fa.zip | |
Fix memory leak in i2b_PVK in error handling.
Simplify parameter checks since this is only called from one place.
Found by Coverity, CID 183502.
ok beck@
Diffstat (limited to 'src/lib/libcrypto/pem/pvkfmt.c')
| -rw-r--r-- | src/lib/libcrypto/pem/pvkfmt.c | 24 |
1 files changed, 10 insertions, 14 deletions
diff --git a/src/lib/libcrypto/pem/pvkfmt.c b/src/lib/libcrypto/pem/pvkfmt.c index 18de5d52a4..76cc6fefe3 100644 --- a/src/lib/libcrypto/pem/pvkfmt.c +++ b/src/lib/libcrypto/pem/pvkfmt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: pvkfmt.c,v 1.19 2017/05/02 03:59:44 deraadt Exp $ */ | 1 | /* $OpenBSD: pvkfmt.c,v 1.20 2018/08/05 11:19:25 bcook 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 2005. | 3 | * project 2005. |
| 4 | */ | 4 | */ |
| @@ -847,17 +847,10 @@ i2b_PVK(unsigned char **out, EVP_PKEY*pk, int enclevel, pem_password_cb *cb, | |||
| 847 | if (pklen < 0) | 847 | if (pklen < 0) |
| 848 | return -1; | 848 | return -1; |
| 849 | outlen += pklen; | 849 | outlen += pklen; |
| 850 | if (!out) | 850 | p = malloc(outlen); |
| 851 | return outlen; | 851 | if (!p) { |
| 852 | if (*out) | 852 | PEMerror(ERR_R_MALLOC_FAILURE); |
| 853 | p = *out; | 853 | return -1; |
| 854 | else { | ||
| 855 | p = malloc(outlen); | ||
| 856 | if (!p) { | ||
| 857 | PEMerror(ERR_R_MALLOC_FAILURE); | ||
| 858 | return -1; | ||
| 859 | } | ||
| 860 | *out = p; | ||
| 861 | } | 854 | } |
| 862 | 855 | ||
| 863 | write_ledword(&p, MS_PVKMAGIC); | 856 | write_ledword(&p, MS_PVKMAGIC); |
| @@ -875,9 +868,10 @@ i2b_PVK(unsigned char **out, EVP_PKEY*pk, int enclevel, pem_password_cb *cb, | |||
| 875 | p += PVK_SALTLEN; | 868 | p += PVK_SALTLEN; |
| 876 | } | 869 | } |
| 877 | do_i2b(&p, pk, 0); | 870 | do_i2b(&p, pk, 0); |
| 878 | if (enclevel == 0) | 871 | if (enclevel == 0) { |
| 872 | *out = p; | ||
| 879 | return outlen; | 873 | return outlen; |
| 880 | else { | 874 | } else { |
| 881 | char psbuf[PEM_BUFSIZE]; | 875 | char psbuf[PEM_BUFSIZE]; |
| 882 | unsigned char keybuf[20]; | 876 | unsigned char keybuf[20]; |
| 883 | int enctmplen, inlen; | 877 | int enctmplen, inlen; |
| @@ -904,10 +898,12 @@ i2b_PVK(unsigned char **out, EVP_PKEY*pk, int enclevel, pem_password_cb *cb, | |||
| 904 | goto error; | 898 | goto error; |
| 905 | } | 899 | } |
| 906 | EVP_CIPHER_CTX_cleanup(&cctx); | 900 | EVP_CIPHER_CTX_cleanup(&cctx); |
| 901 | *out = p; | ||
| 907 | return outlen; | 902 | return outlen; |
| 908 | 903 | ||
| 909 | error: | 904 | error: |
| 910 | EVP_CIPHER_CTX_cleanup(&cctx); | 905 | EVP_CIPHER_CTX_cleanup(&cctx); |
| 906 | free(p); | ||
| 911 | return -1; | 907 | return -1; |
| 912 | } | 908 | } |
| 913 | 909 | ||
