summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorschwarze <>2018-04-04 11:59:26 +0000
committerschwarze <>2018-04-04 11:59:26 +0000
commita0522cf10ae4b806e95c44e85e22fae53f9228d6 (patch)
tree0a16ac7de05cec904ce04fa16baf6b1685b75c32 /src
parentfa93c1f197945062d5ade3c81706f3044c21224b (diff)
downloadopenbsd-a0522cf10ae4b806e95c44e85e22fae53f9228d6.tar.gz
openbsd-a0522cf10ae4b806e95c44e85e22fae53f9228d6.tar.bz2
openbsd-a0522cf10ae4b806e95c44e85e22fae53f9228d6.zip
Fix two bugs in X509_NAME_add_entry(3):
(1) Evaluate the "set" argument, which says whether to create a new RDN or to prepend or append to an existing one, before reusing it for a different purpose, i.e. for the "set" field of the new X509_NAME_ENTRY structure. (2) When incrementing of some "set" fields is needed, increment the correct ones: All those to the right of the newly inserted entry, but not the one of that entry itself. These two bugs caused wrong results whenever using loc != -1, i.e. whenever inserting rather than appending entries, even when using set == 0 only, that is, even when using single-values RDNs only. Both bugs have been continuously present since at least SSLeay-0.8.1 (released July 18, 1997) and the second one since at least SSLeay-0.8.0 (released June 25, 1997), so both are over twenty years old. I found these bugs by code inspection while trying to document the function X509_NAME_ENTRY_set(3), which is public, but undocumented in OpenSSL. OK beck@, jsing@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libcrypto/x509/x509name.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/src/lib/libcrypto/x509/x509name.c b/src/lib/libcrypto/x509/x509name.c
index 2ca1a76b64..4e2695fd74 100644
--- a/src/lib/libcrypto/x509/x509name.c
+++ b/src/lib/libcrypto/x509/x509name.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: x509name.c,v 1.15 2018/03/17 15:28:27 tb Exp $ */ 1/* $OpenBSD: x509name.c,v 1.16 2018/04/04 11:59:26 schwarze Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -249,17 +249,15 @@ X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc, int set)
249 loc = n; 249 loc = n;
250 else if (loc < 0) 250 else if (loc < 0)
251 loc = n; 251 loc = n;
252 252 inc = (set == 0);
253 name->modified = 1; 253 name->modified = 1;
254 254
255 if (set == -1) { 255 if (set == -1) {
256 if (loc == 0) { 256 if (loc == 0) {
257 set = 0; 257 set = 0;
258 inc = 1; 258 inc = 1;
259 } else { 259 } else
260 set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set; 260 set = sk_X509_NAME_ENTRY_value(sk, loc - 1)->set;
261 inc = 0;
262 }
263 } else /* if (set >= 0) */ { 261 } else /* if (set >= 0) */ {
264 if (loc >= n) { 262 if (loc >= n) {
265 if (loc != 0) 263 if (loc != 0)
@@ -268,7 +266,6 @@ X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc, int set)
268 set = 0; 266 set = 0;
269 } else 267 } else
270 set = sk_X509_NAME_ENTRY_value(sk, loc)->set; 268 set = sk_X509_NAME_ENTRY_value(sk, loc)->set;
271 inc = (set == 0) ? 1 : 0;
272 } 269 }
273 270
274 if ((new_name = X509_NAME_ENTRY_dup(ne)) == NULL) 271 if ((new_name = X509_NAME_ENTRY_dup(ne)) == NULL)
@@ -281,7 +278,7 @@ X509_NAME_add_entry(X509_NAME *name, X509_NAME_ENTRY *ne, int loc, int set)
281 if (inc) { 278 if (inc) {
282 n = sk_X509_NAME_ENTRY_num(sk); 279 n = sk_X509_NAME_ENTRY_num(sk);
283 for (i = loc + 1; i < n; i++) 280 for (i = loc + 1; i < n; i++)
284 sk_X509_NAME_ENTRY_value(sk, i - 1)->set += 1; 281 sk_X509_NAME_ENTRY_value(sk, i)->set += 1;
285 } 282 }
286 return (1); 283 return (1);
287 284