diff options
author | Matt Caswell <matt@openssl.org> | 2016-05-04 11:49:06 +0200 |
---|---|---|
committer | Matt Caswell <matt@openssl.org> | 2016-05-18 11:47:15 +0200 |
commit | 690b462126048d4d8ea3376cf13b4833d9f8801d (patch) | |
tree | ccc2a29e8cfd26ebd0a3ac4e8ea137d7fa049817 /engines | |
parent | Fix ts app help message (diff) | |
download | openssl-690b462126048d4d8ea3376cf13b4833d9f8801d.tar.xz openssl-690b462126048d4d8ea3376cf13b4833d9f8801d.zip |
Add some check for malloc failure in the CAPI engine
In the CAPI engine there were some unchecked calls to OPENSSL_strdup().
GH Issue #830
Reviewed-by: Richard Levitte <levitte@openssl.org>
Diffstat (limited to 'engines')
-rw-r--r-- | engines/e_capi.c | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/engines/e_capi.c b/engines/e_capi.c index f1a44065b6..f2d5c3e091 100644 --- a/engines/e_capi.c +++ b/engines/e_capi.c @@ -295,6 +295,7 @@ static int capi_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) int ret = 1; CAPI_CTX *ctx; BIO *out; + LPSTR tmpstr; if (capi_idx == -1) { CAPIerr(CAPI_F_CAPI_CTRL, CAPI_R_ENGINE_NOT_INITIALIZED); return 0; @@ -323,9 +324,15 @@ static int capi_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) break; case CAPI_CMD_STORE_NAME: - OPENSSL_free(ctx->storename); - ctx->storename = OPENSSL_strdup(p); - CAPI_trace(ctx, "Setting store name to %s\n", p); + tmpstr = OPENSSL_strdup(p); + if (tmpstr != NULL) { + OPENSSL_free(ctx->storename); + ctx->storename = tmpstr; + CAPI_trace(ctx, "Setting store name to %s\n", p); + } else { + CAPIerr(CAPI_F_CAPI_CTRL, ERR_R_MALLOC_FAILURE); + ret = 0; + } break; case CAPI_CMD_STORE_FLAGS: @@ -345,8 +352,14 @@ static int capi_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) break; case CAPI_CMD_DEBUG_FILE: - ctx->debug_file = OPENSSL_strdup(p); - CAPI_trace(ctx, "Setting debug file to %s\n", ctx->debug_file); + tmpstr = OPENSSL_strdup(p); + if (tmpstr != NULL) { + ctx->debug_file = tmpstr; + CAPI_trace(ctx, "Setting debug file to %s\n", ctx->debug_file); + } else { + CAPIerr(CAPI_F_CAPI_CTRL, ERR_R_MALLOC_FAILURE); + ret = 0; + } break; case CAPI_CMD_KEYTYPE: @@ -1625,6 +1638,8 @@ static void capi_ctx_free(CAPI_CTX * ctx) static int capi_ctx_set_provname(CAPI_CTX * ctx, LPSTR pname, DWORD type, int check) { + LPSTR tmpcspname; + CAPI_trace(ctx, "capi_ctx_set_provname, name=%s, type=%d\n", pname, type); if (check) { HCRYPTPROV hprov; @@ -1648,8 +1663,13 @@ static int capi_ctx_set_provname(CAPI_CTX * ctx, LPSTR pname, DWORD type, } CryptReleaseContext(hprov, 0); } + tmpcspname = OPENSSL_strdup(pname); + if (tmpcspname == NULL) { + CAPIerr(CAPI_F_CAPI_CTX_SET_PROVNAME, ERR_R_MALLOC_FAILURE); + return 0; + } OPENSSL_free(ctx->cspname); - ctx->cspname = OPENSSL_strdup(pname); + ctx->cspname = tmpcspname; ctx->csptype = type; return 1; } |