diff options
author | doug <> | 2014-12-06 19:26:37 +0000 |
---|---|---|
committer | doug <> | 2014-12-06 19:26:37 +0000 |
commit | e0d29ce4ca3a66fb79a3bdb9e13b5c6ea1e19604 (patch) | |
tree | 4eb8f74a1ef6964a0f0914c23f4236f1b335720b /src | |
parent | 6023656d8c45eb723b7d115cebbb798c866abf5f (diff) | |
download | openbsd-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.c | 14 | ||||
-rw-r--r-- | src/lib/libcrypto/x509v3/v3_purp.c | 24 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/x509/x509_trs.c | 14 | ||||
-rw-r--r-- | src/lib/libssl/src/crypto/x509v3/v3_purp.c | 24 |
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 | ||
228 | err: | 231 | err: |
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 | ||
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 | } |
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 | ||
228 | err: | 231 | err: |
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 | ||
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 | } |