summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordoug <>2014-12-06 19:26:37 +0000
committerdoug <>2014-12-06 19:26:37 +0000
commite0d29ce4ca3a66fb79a3bdb9e13b5c6ea1e19604 (patch)
tree4eb8f74a1ef6964a0f0914c23f4236f1b335720b /src
parent6023656d8c45eb723b7d115cebbb798c866abf5f (diff)
downloadopenbsd-e0d29ce4ca3a66fb79a3bdb9e13b5c6ea1e19604.tar.gz
openbsd-e0d29ce4ca3a66fb79a3bdb9e13b5c6ea1e19604.tar.bz2
openbsd-e0d29ce4ca3a66fb79a3bdb9e13b5c6ea1e19604.zip
Avoid modifying input on failure in X509_(TRUST|PURPOSE)_add.
If X509_TRUST_add() or X509_PURPOSE_add() fail, they will leave the object in an inconsistent state since the name is already freed. This commit avoids changing the original name unless the *_add() call will succeed. Based on BoringSSL's commit: ab2815eaff6219ef57aedca2f7b1b72333c27fd0 ok miod@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/x509/x509_trs.c14
-rw-r--r--src/lib/libcrypto/x509v3/v3_purp.c24
-rw-r--r--src/lib/libssl/src/crypto/x509/x509_trs.c14
-rw-r--r--src/lib/libssl/src/crypto/x509v3/v3_purp.c24
4 files changed, 42 insertions, 34 deletions
diff --git a/src/lib/libcrypto/x509/x509_trs.c b/src/lib/libcrypto/x509/x509_trs.c
index 95fb568c68..4fa9f81ee7 100644
--- a/src/lib/libcrypto/x509/x509_trs.c
+++ b/src/lib/libcrypto/x509/x509_trs.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_trs.c,v 1.18 2014/11/18 03:28:05 tedu Exp $ */ 1/* $OpenBSD: x509_trs.c,v 1.19 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 1999. 3 * project 1999.
4 */ 4 */
@@ -177,6 +177,7 @@ X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
177{ 177{
178 int idx; 178 int idx;
179 X509_TRUST *trtmp; 179 X509_TRUST *trtmp;
180 char *name_dup;
180 181
181 /* This is set according to what we change: application can't set it */ 182 /* This is set according to what we change: application can't set it */
182 flags &= ~X509_TRUST_DYNAMIC; 183 flags &= ~X509_TRUST_DYNAMIC;
@@ -199,12 +200,14 @@ X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
199 } 200 }
200 } 201 }
201 202
203 if ((name_dup = strdup(name)) == NULL)
204 goto err;
205
202 /* free existing name if dynamic */ 206 /* free existing name if dynamic */
203 if (trtmp->flags & X509_TRUST_DYNAMIC_NAME) 207 if (trtmp->flags & X509_TRUST_DYNAMIC_NAME)
204 free(trtmp->name); 208 free(trtmp->name);
205 /* dup supplied name */ 209 /* dup supplied name */
206 if ((trtmp->name = strdup(name)) == NULL) 210 trtmp->name = name_dup;
207 goto err;
208 /* Keep the dynamic flag of existing entry */ 211 /* Keep the dynamic flag of existing entry */
209 trtmp->flags &= X509_TRUST_DYNAMIC; 212 trtmp->flags &= X509_TRUST_DYNAMIC;
210 /* Set all other flags */ 213 /* Set all other flags */
@@ -226,10 +229,9 @@ X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
226 return 1; 229 return 1;
227 230
228err: 231err:
229 if (idx == -1) { 232 free(name_dup);
230 free(trtmp->name); 233 if (idx == -1)
231 free(trtmp); 234 free(trtmp);
232 }
233 X509err(X509_F_X509_TRUST_ADD, ERR_R_MALLOC_FAILURE); 235 X509err(X509_F_X509_TRUST_ADD, ERR_R_MALLOC_FAILURE);
234 return 0; 236 return 0;
235} 237}
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}
diff --git a/src/lib/libssl/src/crypto/x509/x509_trs.c b/src/lib/libssl/src/crypto/x509/x509_trs.c
index 95fb568c68..4fa9f81ee7 100644
--- a/src/lib/libssl/src/crypto/x509/x509_trs.c
+++ b/src/lib/libssl/src/crypto/x509/x509_trs.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509_trs.c,v 1.18 2014/11/18 03:28:05 tedu Exp $ */ 1/* $OpenBSD: x509_trs.c,v 1.19 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 1999. 3 * project 1999.
4 */ 4 */
@@ -177,6 +177,7 @@ X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
177{ 177{
178 int idx; 178 int idx;
179 X509_TRUST *trtmp; 179 X509_TRUST *trtmp;
180 char *name_dup;
180 181
181 /* This is set according to what we change: application can't set it */ 182 /* This is set according to what we change: application can't set it */
182 flags &= ~X509_TRUST_DYNAMIC; 183 flags &= ~X509_TRUST_DYNAMIC;
@@ -199,12 +200,14 @@ X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
199 } 200 }
200 } 201 }
201 202
203 if ((name_dup = strdup(name)) == NULL)
204 goto err;
205
202 /* free existing name if dynamic */ 206 /* free existing name if dynamic */
203 if (trtmp->flags & X509_TRUST_DYNAMIC_NAME) 207 if (trtmp->flags & X509_TRUST_DYNAMIC_NAME)
204 free(trtmp->name); 208 free(trtmp->name);
205 /* dup supplied name */ 209 /* dup supplied name */
206 if ((trtmp->name = strdup(name)) == NULL) 210 trtmp->name = name_dup;
207 goto err;
208 /* Keep the dynamic flag of existing entry */ 211 /* Keep the dynamic flag of existing entry */
209 trtmp->flags &= X509_TRUST_DYNAMIC; 212 trtmp->flags &= X509_TRUST_DYNAMIC;
210 /* Set all other flags */ 213 /* Set all other flags */
@@ -226,10 +229,9 @@ X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
226 return 1; 229 return 1;
227 230
228err: 231err:
229 if (idx == -1) { 232 free(name_dup);
230 free(trtmp->name); 233 if (idx == -1)
231 free(trtmp); 234 free(trtmp);
232 }
233 X509err(X509_F_X509_TRUST_ADD, ERR_R_MALLOC_FAILURE); 235 X509err(X509_F_X509_TRUST_ADD, ERR_R_MALLOC_FAILURE);
234 return 0; 236 return 0;
235} 237}
diff --git a/src/lib/libssl/src/crypto/x509v3/v3_purp.c b/src/lib/libssl/src/crypto/x509v3/v3_purp.c
index 1a073e368e..b020f87a0f 100644
--- a/src/lib/libssl/src/crypto/x509v3/v3_purp.c
+++ b/src/lib/libssl/src/crypto/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}