aboutsummaryrefslogtreecommitdiffstats
path: root/engines
diff options
context:
space:
mode:
authorMatt Caswell <matt@openssl.org>2016-05-04 10:49:06 +0100
committerMatt Caswell <matt@openssl.org>2016-05-18 10:47:15 +0100
commit690b462126048d4d8ea3376cf13b4833d9f8801d (patch)
treeccc2a29e8cfd26ebd0a3ac4e8ea137d7fa049817 /engines
parent15b083e44e122b8448002a8579e860f0be622e19 (diff)
downloadopenssl-690b462126048d4d8ea3376cf13b4833d9f8801d.tar.gz
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.c32
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;
}