diff options
Diffstat (limited to 'src/lib/libcrypto/x509v3')
| -rw-r--r-- | src/lib/libcrypto/x509v3/v3_purp.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_purp.c b/src/lib/libcrypto/x509v3/v3_purp.c index 1a073e368e..b020f87a0f 100644 --- a/src/lib/libcrypto/x509v3/v3_purp.c +++ b/src/lib/libcrypto/x509v3/v3_purp.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: v3_purp.c,v 1.23 2014/10/05 18:33:57 miod Exp $ */ | 1 | /* $OpenBSD: v3_purp.c,v 1.24 2014/12/06 19:26:37 doug 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 2001. | 3 | * project 2001. |
| 4 | */ | 4 | */ |
| @@ -203,6 +203,9 @@ X509_PURPOSE_add(int id, int trust, int flags, | |||
| 203 | { | 203 | { |
| 204 | int idx; | 204 | int idx; |
| 205 | X509_PURPOSE *ptmp; | 205 | X509_PURPOSE *ptmp; |
| 206 | char *name_dup, *sname_dup; | ||
| 207 | |||
| 208 | name_dup = sname_dup = NULL; | ||
| 206 | 209 | ||
| 207 | if (name == NULL || sname == NULL) { | 210 | if (name == NULL || sname == NULL) { |
| 208 | X509V3err(X509V3_F_X509_PURPOSE_ADD, | 211 | X509V3err(X509V3_F_X509_PURPOSE_ADD, |
| @@ -227,16 +230,19 @@ X509_PURPOSE_add(int id, int trust, int flags, | |||
| 227 | } else | 230 | } else |
| 228 | ptmp = X509_PURPOSE_get0(idx); | 231 | ptmp = X509_PURPOSE_get0(idx); |
| 229 | 232 | ||
| 233 | if ((name_dup = strdup(name)) == NULL) | ||
| 234 | goto err; | ||
| 235 | if ((sname_dup = strdup(sname)) == NULL) | ||
| 236 | goto err; | ||
| 237 | |||
| 230 | /* free existing name if dynamic */ | 238 | /* free existing name if dynamic */ |
| 231 | if (ptmp->flags & X509_PURPOSE_DYNAMIC_NAME) { | 239 | if (ptmp->flags & X509_PURPOSE_DYNAMIC_NAME) { |
| 232 | free(ptmp->name); | 240 | free(ptmp->name); |
| 233 | free(ptmp->sname); | 241 | free(ptmp->sname); |
| 234 | } | 242 | } |
| 235 | /* dup supplied name */ | 243 | /* dup supplied name */ |
| 236 | ptmp->name = strdup(name); | 244 | ptmp->name = name_dup; |
| 237 | ptmp->sname = strdup(sname); | 245 | ptmp->sname = sname_dup; |
| 238 | if (ptmp->name == NULL || ptmp->sname == NULL) | ||
| 239 | goto err; | ||
| 240 | /* Keep the dynamic flag of existing entry */ | 246 | /* Keep the dynamic flag of existing entry */ |
| 241 | ptmp->flags &= X509_PURPOSE_DYNAMIC; | 247 | ptmp->flags &= X509_PURPOSE_DYNAMIC; |
| 242 | /* Set all other flags */ | 248 | /* Set all other flags */ |
| @@ -258,14 +264,10 @@ X509_PURPOSE_add(int id, int trust, int flags, | |||
| 258 | return 1; | 264 | return 1; |
| 259 | 265 | ||
| 260 | err: | 266 | err: |
| 261 | free(ptmp->name); | 267 | free(name_dup); |
| 262 | free(ptmp->sname); | 268 | free(sname_dup); |
| 263 | if (idx == -1) | 269 | if (idx == -1) |
| 264 | free(ptmp); | 270 | free(ptmp); |
| 265 | else { | ||
| 266 | ptmp->name = NULL; | ||
| 267 | ptmp->sname = NULL; | ||
| 268 | } | ||
| 269 | X509V3err(X509V3_F_X509_PURPOSE_ADD, ERR_R_MALLOC_FAILURE); | 271 | X509V3err(X509V3_F_X509_PURPOSE_ADD, ERR_R_MALLOC_FAILURE); |
| 270 | return 0; | 272 | return 0; |
| 271 | } | 273 | } |
