1 |
vip-ire |
1.1 |
diff -up openssl-fips-0.9.8e/crypto/x509/by_dir.c.lock openssl-fips-0.9.8e/crypto/x509/by_dir.c |
2 |
|
|
--- openssl-fips-0.9.8e/crypto/x509/by_dir.c.lock 2014-08-08 11:54:24.000000000 +0200 |
3 |
|
|
+++ openssl-fips-0.9.8e/crypto/x509/by_dir.c 2014-12-17 14:38:00.660309868 +0100 |
4 |
|
|
@@ -356,11 +356,11 @@ static int get_cert_by_subject(X509_LOOK |
5 |
|
|
|
6 |
|
|
/* we have added it to the cache so now pull |
7 |
|
|
* it out again */ |
8 |
|
|
- CRYPTO_r_lock(CRYPTO_LOCK_X509_STORE); |
9 |
|
|
+ CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); |
10 |
|
|
j = sk_X509_OBJECT_find(xl->store_ctx->objs,&stmp); |
11 |
|
|
if(j != -1) tmp=sk_X509_OBJECT_value(xl->store_ctx->objs,j); |
12 |
|
|
else tmp = NULL; |
13 |
|
|
- CRYPTO_r_unlock(CRYPTO_LOCK_X509_STORE); |
14 |
|
|
+ CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
15 |
|
|
|
16 |
|
|
if (tmp != NULL) |
17 |
|
|
{ |
18 |
|
|
@@ -379,4 +379,3 @@ finish: |
19 |
|
|
if (b != NULL) BUF_MEM_free(b); |
20 |
|
|
return(ok); |
21 |
|
|
} |
22 |
|
|
- |
23 |
|
|
diff -up openssl-fips-0.9.8e/crypto/x509/x509_lu.c.lock openssl-fips-0.9.8e/crypto/x509/x509_lu.c |
24 |
|
|
--- openssl-fips-0.9.8e/crypto/x509/x509_lu.c.lock 2014-08-08 11:54:24.000000000 +0200 |
25 |
|
|
+++ openssl-fips-0.9.8e/crypto/x509/x509_lu.c 2014-12-17 14:38:00.660309868 +0100 |
26 |
|
|
@@ -286,7 +286,9 @@ int X509_STORE_get_by_subject(X509_STORE |
27 |
|
|
X509_OBJECT stmp,*tmp; |
28 |
|
|
int i,j; |
29 |
|
|
|
30 |
|
|
+ CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); |
31 |
|
|
tmp=X509_OBJECT_retrieve_by_subject(ctx->objs,type,name); |
32 |
|
|
+ CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
33 |
|
|
|
34 |
|
|
if (tmp == NULL) |
35 |
|
|
{ |
36 |
|
|
@@ -340,7 +342,6 @@ int X509_STORE_add_cert(X509_STORE *ctx, |
37 |
|
|
|
38 |
|
|
X509_OBJECT_up_ref_count(obj); |
39 |
|
|
|
40 |
|
|
- |
41 |
|
|
if (X509_OBJECT_retrieve_match(ctx->objs, obj)) |
42 |
|
|
{ |
43 |
|
|
X509_OBJECT_free_contents(obj); |
44 |
|
|
@@ -491,13 +492,13 @@ X509_OBJECT *X509_OBJECT_retrieve_match( |
45 |
|
|
return obj; |
46 |
|
|
} |
47 |
|
|
return NULL; |
48 |
|
|
-} |
49 |
|
|
+ } |
50 |
|
|
|
51 |
|
|
|
52 |
|
|
/* Try to get issuer certificate from store. Due to limitations |
53 |
|
|
* of the API this can only retrieve a single certificate matching |
54 |
|
|
* a given subject name. However it will fill the cache with all |
55 |
|
|
- * matching certificates, so we can examine the cache for all |
56 |
|
|
+ * matching certificates, so we can examine the cache for all |
57 |
|
|
* matches. |
58 |
|
|
* |
59 |
|
|
* Return values are: |
60 |
|
|
@@ -505,13 +506,11 @@ X509_OBJECT *X509_OBJECT_retrieve_match( |
61 |
|
|
* 0 certificate not found. |
62 |
|
|
* -1 some other error. |
63 |
|
|
*/ |
64 |
|
|
- |
65 |
|
|
- |
66 |
|
|
int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x) |
67 |
|
|
-{ |
68 |
|
|
+ { |
69 |
|
|
X509_NAME *xn; |
70 |
|
|
X509_OBJECT obj, *pobj; |
71 |
|
|
- int i, ok, idx; |
72 |
|
|
+ int i, ok, idx, ret; |
73 |
|
|
xn=X509_get_issuer_name(x); |
74 |
|
|
ok=X509_STORE_get_by_subject(ctx,X509_LU_X509,xn,&obj); |
75 |
|
|
if (ok != X509_LU_X509) |
76 |
|
|
@@ -537,27 +536,34 @@ int X509_STORE_CTX_get1_issuer(X509 **is |
77 |
|
|
return 1; |
78 |
|
|
} |
79 |
|
|
X509_OBJECT_free_contents(&obj); |
80 |
|
|
- /* Else find index of first matching cert */ |
81 |
|
|
- idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn); |
82 |
|
|
- /* This shouldn't normally happen since we already have one match */ |
83 |
|
|
- if (idx == -1) return 0; |
84 |
|
|
|
85 |
|
|
- /* Look through all matching certificates for a suitable issuer */ |
86 |
|
|
- for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) |
87 |
|
|
+ /* Else find index of first cert accepted by 'check_issued' */ |
88 |
|
|
+ ret = 0; |
89 |
|
|
+ CRYPTO_w_lock(CRYPTO_LOCK_X509_STORE); |
90 |
|
|
+ idx = X509_OBJECT_idx_by_subject(ctx->ctx->objs, X509_LU_X509, xn); |
91 |
|
|
+ if (idx != -1) /* should be true as we've had at least one match */ |
92 |
|
|
{ |
93 |
|
|
- pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i); |
94 |
|
|
- /* See if we've ran out of matches */ |
95 |
|
|
- if (pobj->type != X509_LU_X509) return 0; |
96 |
|
|
- if (X509_NAME_cmp(xn, X509_get_subject_name(pobj->data.x509))) return 0; |
97 |
|
|
- if (ctx->check_issued(ctx, x, pobj->data.x509)) |
98 |
|
|
+ /* Look through all matching certs for suitable issuer */ |
99 |
|
|
+ for (i = idx; i < sk_X509_OBJECT_num(ctx->ctx->objs); i++) |
100 |
|
|
{ |
101 |
|
|
- *issuer = pobj->data.x509; |
102 |
|
|
- X509_OBJECT_up_ref_count(pobj); |
103 |
|
|
- return 1; |
104 |
|
|
+ pobj = sk_X509_OBJECT_value(ctx->ctx->objs, i); |
105 |
|
|
+ /* See if we've run past the matches */ |
106 |
|
|
+ if (pobj->type != X509_LU_X509) |
107 |
|
|
+ break; |
108 |
|
|
+ if (X509_NAME_cmp(xn, X509_get_subject_name(pobj->data.x509))) |
109 |
|
|
+ break; |
110 |
|
|
+ if (ctx->check_issued(ctx, x, pobj->data.x509)) |
111 |
|
|
+ { |
112 |
|
|
+ *issuer = pobj->data.x509; |
113 |
|
|
+ X509_OBJECT_up_ref_count(pobj); |
114 |
|
|
+ ret = 1; |
115 |
|
|
+ break; |
116 |
|
|
+ } |
117 |
|
|
} |
118 |
|
|
} |
119 |
|
|
- return 0; |
120 |
|
|
-} |
121 |
|
|
+ CRYPTO_w_unlock(CRYPTO_LOCK_X509_STORE); |
122 |
|
|
+ return ret; |
123 |
|
|
+ } |
124 |
|
|
|
125 |
|
|
int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags) |
126 |
|
|
{ |