summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/x509v3/v3_purp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_purp.c')
-rw-r--r--src/lib/libcrypto/x509v3/v3_purp.c24
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
260err: 266err:
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}