OpenCoverage

ex_data.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/ex_data.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.-
3 *-
4 * Licensed under the OpenSSL license (the "License"). You may not use-
5 * this file except in compliance with the License. You can obtain a copy-
6 * in the file LICENSE in the source distribution or at-
7 * https://www.openssl.org/source/license.html-
8 */-
9-
10#include "internal/cryptlib_int.h"-
11#include "internal/thread_once.h"-
12-
13/*-
14 * Each structure type (sometimes called a class), that supports-
15 * exdata has a stack of callbacks for each instance.-
16 */-
17struct ex_callback_st {-
18 long argl; /* Arbitrary long */-
19 void *argp; /* Arbitrary void * */-
20 CRYPTO_EX_new *new_func;-
21 CRYPTO_EX_free *free_func;-
22 CRYPTO_EX_dup *dup_func;-
23};-
24-
25/*-
26 * The state for each class. This could just be a typedef, but-
27 * a structure allows future changes.-
28 */-
29typedef struct ex_callbacks_st {-
30 STACK_OF(EX_CALLBACK) *meth;-
31} EX_CALLBACKS;-
32-
33static EX_CALLBACKS ex_data[CRYPTO_EX_INDEX__COUNT];-
34-
35static CRYPTO_RWLOCK *ex_data_lock = NULL;-
36static CRYPTO_ONCE ex_data_init = CRYPTO_ONCE_STATIC_INIT;-
37-
38DEFINE_RUN_ONCE_STATIC(do_ex_data_init)
executed 2072 times by 12 tests: end of block
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
2072
39{-
40 if (!OPENSSL_init_crypto(0, NULL))
!OPENSSL_init_... ((void *)0) )Description
TRUEnever evaluated
FALSEevaluated 2072 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
0-2072
41 return 0;
never executed: return 0;
0
42 ex_data_lock = CRYPTO_THREAD_lock_new();-
43 return ex_data_lock != NULL;
executed 2072 times by 12 tests: return ex_data_lock != ((void *)0) ;
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
2072
44}-
45-
46/*-
47 * Return the EX_CALLBACKS from the |ex_data| array that corresponds to-
48 * a given class. On success, *holds the lock.*-
49 */-
50static EX_CALLBACKS *get_and_lock(int class_index)-
51{-
52 EX_CALLBACKS *ip;-
53-
54 if (class_index < 0 || class_index >= CRYPTO_EX_INDEX__COUNT) {
class_index < 0Description
TRUEnever evaluated
FALSEevaluated 771175 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
class_index >= 16Description
TRUEnever evaluated
FALSEevaluated 771175 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
0-771175
55 CRYPTOerr(CRYPTO_F_GET_AND_LOCK, ERR_R_PASSED_INVALID_ARGUMENT);-
56 return NULL;
never executed: return ((void *)0) ;
0
57 }-
58-
59 if (!RUN_ONCE(&ex_data_init, do_ex_data_init)) {
!(CRYPTO_THREA...ossl_ret_ : 0)Description
TRUEnever evaluated
FALSEevaluated 771175 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
CRYPTO_THREAD_...ta_init_ossl_)Description
TRUEevaluated 771175 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
FALSEnever evaluated
0-771175
60 CRYPTOerr(CRYPTO_F_GET_AND_LOCK, ERR_R_MALLOC_FAILURE);-
61 return NULL;
never executed: return ((void *)0) ;
0
62 }-
63-
64 if (ex_data_lock == NULL) {
ex_data_lock == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 771175 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
0-771175
65 /*-
66 * This can happen in normal operation when using CRYPTO_mem_leaks().-
67 * The CRYPTO_mem_leaks() function calls OPENSSL_cleanup() which cleans-
68 * up the locks. Subsequently the BIO that CRYPTO_mem_leaks() uses gets-
69 * freed, which also attempts to free the ex_data. However-
70 * CRYPTO_mem_leaks() ensures that the ex_data is freed early (i.e.-
71 * before OPENSSL_cleanup() is called), so if we get here we can safely-
72 * ignore this operation. We just treat it as an error.-
73 */-
74 return NULL;
never executed: return ((void *)0) ;
0
75 }-
76-
77 ip = &ex_data[class_index];-
78 CRYPTO_THREAD_write_lock(ex_data_lock);-
79 return ip;
executed 771175 times by 12 tests: return ip;
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
771175
80}-
81-
82static void cleanup_cb(EX_CALLBACK *funcs)-
83{-
84 OPENSSL_free(funcs);-
85}
executed 2122 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
2122
86-
87/*-
88 * Release all "ex_data" state to prevent memory leaks. This can't be made-
89 * thread-safe without overhauling a lot of stuff, and shouldn't really be-
90 * called under potential race-conditions anyway (it's for program shutdown-
91 * after all).-
92 */-
93void crypto_cleanup_all_ex_data_int(void)-
94{-
95 int i;-
96-
97 for (i = 0; i < CRYPTO_EX_INDEX__COUNT; ++i) {
i < 16Description
TRUEevaluated 33216 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
FALSEevaluated 2076 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
2076-33216
98 EX_CALLBACKS *ip = &ex_data[i];-
99-
100 sk_EX_CALLBACK_pop_free(ip->meth, cleanup_cb);-
101 ip->meth = NULL;-
102 }
executed 33216 times by 12 tests: end of block
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
33216
103-
104 CRYPTO_THREAD_lock_free(ex_data_lock);-
105 ex_data_lock = NULL;-
106}
executed 2076 times by 12 tests: end of block
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
2076
107-
108-
109/*-
110 * Unregister a new index by replacing the callbacks with no-ops.-
111 * Any in-use instances are leaked.-
112 */-
113static void dummy_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad, int idx,-
114 long argl, void *argp)-
115{-
116}-
117-
118static void dummy_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad, int idx,-
119 long argl, void *argp)-
120{-
121}-
122-
123static int dummy_dup(CRYPTO_EX_DATA *to, const CRYPTO_EX_DATA *from,-
124 void *from_d, int idx,-
125 long argl, void *argp)-
126{-
127 return 1;
never executed: return 1;
0
128}-
129-
130int CRYPTO_free_ex_index(int class_index, int idx)-
131{-
132 EX_CALLBACKS *ip = get_and_lock(class_index);-
133 EX_CALLBACK *a;-
134 int toret = 0;-
135-
136 if (ip == NULL)
ip == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 8 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-8
137 return 0;
never executed: return 0;
0
138 if (idx < 0 || idx >= sk_EX_CALLBACK_num(ip->meth))
idx < 0Description
TRUEevaluated 8 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
idx >= sk_EX_C..._num(ip->meth)Description
TRUEnever evaluated
FALSEnever evaluated
0-8
139 goto err;
executed 8 times by 1 test: goto err;
Executed by:
  • libcrypto.so.1.1
8
140 a = sk_EX_CALLBACK_value(ip->meth, idx);-
141 if (a == NULL)
a == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
142 goto err;
never executed: goto err;
0
143 a->new_func = dummy_new;-
144 a->dup_func = dummy_dup;-
145 a->free_func = dummy_free;-
146 toret = 1;-
147err:
code before this statement never executed: err:
0
148 CRYPTO_THREAD_unlock(ex_data_lock);-
149 return toret;
executed 8 times by 1 test: return toret;
Executed by:
  • libcrypto.so.1.1
8
150}-
151-
152/*-
153 * Register a new index.-
154 */-
155int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,-
156 CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func,-
157 CRYPTO_EX_free *free_func)-
158{-
159 int toret = -1;-
160 EX_CALLBACK *a;-
161 EX_CALLBACKS *ip = get_and_lock(class_index);-
162-
163 if (ip == NULL)
ip == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 2122 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2122
164 return -1;
never executed: return -1;
0
165-
166 if (ip->meth == NULL) {
ip->meth == ((void *)0)Description
TRUEevaluated 937 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1185 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
937-1185
167 ip->meth = sk_EX_CALLBACK_new_null();-
168 /* We push an initial value on the stack because the SSL-
169 * "app_data" routines use ex_data index zero. See RT 3710. */-
170 if (ip->meth == NULL
ip->meth == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 937 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-937
171 || !sk_EX_CALLBACK_push(ip->meth, NULL)) {
!sk_EX_CALLBAC... ((void *)0) )Description
TRUEnever evaluated
FALSEevaluated 937 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-937
172 CRYPTOerr(CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX, ERR_R_MALLOC_FAILURE);-
173 goto err;
never executed: goto err;
0
174 }-
175 }
executed 937 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
937
176-
177 a = (EX_CALLBACK *)OPENSSL_malloc(sizeof(*a));-
178 if (a == NULL) {
a == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 2122 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2122
179 CRYPTOerr(CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX, ERR_R_MALLOC_FAILURE);-
180 goto err;
never executed: goto err;
0
181 }-
182 a->argl = argl;-
183 a->argp = argp;-
184 a->new_func = new_func;-
185 a->dup_func = dup_func;-
186 a->free_func = free_func;-
187-
188 if (!sk_EX_CALLBACK_push(ip->meth, NULL)) {
!sk_EX_CALLBAC... ((void *)0) )Description
TRUEnever evaluated
FALSEevaluated 2122 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2122
189 CRYPTOerr(CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX, ERR_R_MALLOC_FAILURE);-
190 OPENSSL_free(a);-
191 goto err;
never executed: goto err;
0
192 }-
193 toret = sk_EX_CALLBACK_num(ip->meth) - 1;-
194 (void)sk_EX_CALLBACK_set(ip->meth, toret, a);-
195-
196 err:
code before this statement executed 2122 times by 1 test: err:
Executed by:
  • libcrypto.so.1.1
2122
197 CRYPTO_THREAD_unlock(ex_data_lock);-
198 return toret;
executed 2122 times by 1 test: return toret;
Executed by:
  • libcrypto.so.1.1
2122
199}-
200-
201/*-
202 * Initialise a new CRYPTO_EX_DATA for use in a particular class - including-
203 * calling new() callbacks for each index in the class used by this variable-
204 * Thread-safe by copying a class's array of "EX_CALLBACK" entries-
205 * in the lock, then using them outside the lock. Note this only applies-
206 * to the global "ex_data" state (ie. class definitions), not 'ad' itself.-
207 */-
208int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad)-
209{-
210 int mx, i;-
211 void *ptr;-
212 EX_CALLBACK **storage = NULL;-
213 EX_CALLBACK *stack[10];-
214 EX_CALLBACKS *ip = get_and_lock(class_index);-
215-
216 if (ip == NULL)
ip == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 381421 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
0-381421
217 return 0;
never executed: return 0;
0
218-
219 ad->sk = NULL;-
220-
221 mx = sk_EX_CALLBACK_num(ip->meth);-
222 if (mx > 0) {
mx > 0Description
TRUEevaluated 7136 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 374285 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
7136-374285
223 if (mx < (int)OSSL_NELEM(stack))
mx < (int)(siz...f((stack)[0]))Description
TRUEevaluated 5098 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2038 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
2038-5098
224 storage = stack;
executed 5098 times by 1 test: storage = stack;
Executed by:
  • libcrypto.so.1.1
5098
225 else-
226 storage = OPENSSL_malloc(sizeof(*storage) * mx);
executed 2038 times by 1 test: storage = CRYPTO_malloc(sizeof(*storage) * mx, __FILE__, 226);
Executed by:
  • libcrypto.so.1.1
2038
227 if (storage != NULL)
storage != ((void *)0)Description
TRUEevaluated 7136 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-7136
228 for (i = 0; i < mx; i++)
i < mxDescription
TRUEevaluated 499969 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 7136 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
7136-499969
229 storage[i] = sk_EX_CALLBACK_value(ip->meth, i);
executed 499969 times by 1 test: storage[i] = sk_EX_CALLBACK_value(ip->meth, i);
Executed by:
  • libcrypto.so.1.1
499969
230 }
executed 7136 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
7136
231 CRYPTO_THREAD_unlock(ex_data_lock);-
232-
233 if (mx > 0 && storage == NULL) {
mx > 0Description
TRUEevaluated 7136 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 374285 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
storage == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 7136 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-374285
234 CRYPTOerr(CRYPTO_F_CRYPTO_NEW_EX_DATA, ERR_R_MALLOC_FAILURE);-
235 return 0;
never executed: return 0;
0
236 }-
237 for (i = 0; i < mx; i++) {
i < mxDescription
TRUEevaluated 499969 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 381421 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
381421-499969
238 if (storage[i] && storage[i]->new_func) {
storage[i]Description
TRUEevaluated 492833 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 7136 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
storage[i]->new_funcDescription
TRUEevaluated 7 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 492826 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
7-492833
239 ptr = CRYPTO_get_ex_data(ad, i);-
240 storage[i]->new_func(obj, ptr, ad, i,-
241 storage[i]->argl, storage[i]->argp);-
242 }
executed 7 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
7
243 }
executed 499969 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
499969
244 if (storage != stack)
storage != stackDescription
TRUEevaluated 376323 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
FALSEevaluated 5098 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
5098-376323
245 OPENSSL_free(storage);
executed 376323 times by 12 tests: CRYPTO_free(storage, __FILE__, 245);
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
376323
246 return 1;
executed 381421 times by 12 tests: return 1;
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
381421
247}-
248-
249/*-
250 * Duplicate a CRYPTO_EX_DATA variable - including calling dup() callbacks-
251 * for each index in the class used by this variable-
252 */-
253int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to,-
254 const CRYPTO_EX_DATA *from)-
255{-
256 int mx, j, i;-
257 void *ptr;-
258 EX_CALLBACK *stack[10];-
259 EX_CALLBACK **storage = NULL;-
260 EX_CALLBACKS *ip;-
261 int toret = 0;-
262-
263 if (from->sk == NULL)
from->sk == ((void *)0)Description
TRUEevaluated 2890 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-2890
264 /* Nothing to copy over */-
265 return 1;
executed 2890 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
2890
266 if ((ip = get_and_lock(class_index)) == NULL)
(ip = get_and_...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
267 return 0;
never executed: return 0;
0
268-
269 mx = sk_EX_CALLBACK_num(ip->meth);-
270 j = sk_void_num(from->sk);-
271 if (j < mx)
j < mxDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
272 mx = j;
never executed: mx = j;
0
273 if (mx > 0) {
mx > 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-1
274 if (mx < (int)OSSL_NELEM(stack))
mx < (int)(siz...f((stack)[0]))Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-1
275 storage = stack;
executed 1 time by 1 test: storage = stack;
Executed by:
  • libcrypto.so.1.1
1
276 else-
277 storage = OPENSSL_malloc(sizeof(*storage) * mx);
never executed: storage = CRYPTO_malloc(sizeof(*storage) * mx, __FILE__, 277);
0
278 if (storage != NULL)
storage != ((void *)0)Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-1
279 for (i = 0; i < mx; i++)
i < mxDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-3
280 storage[i] = sk_EX_CALLBACK_value(ip->meth, i);
executed 3 times by 1 test: storage[i] = sk_EX_CALLBACK_value(ip->meth, i);
Executed by:
  • libcrypto.so.1.1
3
281 }
executed 1 time by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
1
282 CRYPTO_THREAD_unlock(ex_data_lock);-
283-
284 if (mx == 0)
mx == 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
285 return 1;
never executed: return 1;
0
286 if (storage == NULL) {
storage == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
287 CRYPTOerr(CRYPTO_F_CRYPTO_DUP_EX_DATA, ERR_R_MALLOC_FAILURE);-
288 return 0;
never executed: return 0;
0
289 }-
290 /*-
291 * Make sure the ex_data stack is at least |mx| elements long to avoid-
292 * issues in the for loop that follows; so go get the |mx|'th element-
293 * (if it does not exist CRYPTO_get_ex_data() returns NULL), and assign-
294 * to itself. This is normally a no-op; but ensures the stack is the-
295 * proper size-
296 */-
297 if (!CRYPTO_set_ex_data(to, mx - 1, CRYPTO_get_ex_data(to, mx - 1)))
!CRYPTO_set_ex...a(to, mx - 1))Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
298 goto err;
never executed: goto err;
0
299-
300 for (i = 0; i < mx; i++) {
i < mxDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-3
301 ptr = CRYPTO_get_ex_data(from, i);-
302 if (storage[i] && storage[i]->dup_func)
storage[i]Description
TRUEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
storage[i]->dup_funcDescription
TRUEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-2
303 if (!storage[i]->dup_func(to, from, &ptr, i,
!storage[i]->d...rage[i]->argp)Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
304 storage[i]->argl, storage[i]->argp))
!storage[i]->d...rage[i]->argp)Description
TRUEnever evaluated
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-2
305 goto err;
never executed: goto err;
0
306 CRYPTO_set_ex_data(to, i, ptr);-
307 }
executed 3 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
3
308 toret = 1;-
309 err:
code before this statement executed 1 time by 1 test: err:
Executed by:
  • libcrypto.so.1.1
1
310 if (storage != stack)
storage != stackDescription
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
311 OPENSSL_free(storage);
never executed: CRYPTO_free(storage, __FILE__, 311);
0
312 return toret;
executed 1 time by 1 test: return toret;
Executed by:
  • libcrypto.so.1.1
1
313}-
314-
315-
316/*-
317 * Cleanup a CRYPTO_EX_DATA variable - including calling free() callbacks for-
318 * each index in the class used by this variable-
319 */-
320void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad)-
321{-
322 int mx, i;-
323 EX_CALLBACKS *ip;-
324 void *ptr;-
325 EX_CALLBACK *f;-
326 EX_CALLBACK *stack[10];-
327 EX_CALLBACK **storage = NULL;-
328-
329 if ((ip = get_and_lock(class_index)) == NULL)
(ip = get_and_...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 387623 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
0-387623
330 goto err;
never executed: goto err;
0
331-
332 mx = sk_EX_CALLBACK_num(ip->meth);-
333 if (mx > 0) {
mx > 0Description
TRUEevaluated 12318 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 375305 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
12318-375305
334 if (mx < (int)OSSL_NELEM(stack))
mx < (int)(siz...f((stack)[0]))Description
TRUEevaluated 10246 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2072 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
2072-10246
335 storage = stack;
executed 10246 times by 1 test: storage = stack;
Executed by:
  • libcrypto.so.1.1
10246
336 else-
337 storage = OPENSSL_malloc(sizeof(*storage) * mx);
executed 2072 times by 1 test: storage = CRYPTO_malloc(sizeof(*storage) * mx, __FILE__, 337);
Executed by:
  • libcrypto.so.1.1
2072
338 if (storage != NULL)
storage != ((void *)0)Description
TRUEevaluated 12318 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-12318
339 for (i = 0; i < mx; i++)
i < mxDescription
TRUEevaluated 512701 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 12318 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
12318-512701
340 storage[i] = sk_EX_CALLBACK_value(ip->meth, i);
executed 512701 times by 1 test: storage[i] = sk_EX_CALLBACK_value(ip->meth, i);
Executed by:
  • libcrypto.so.1.1
512701
341 }
executed 12318 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
12318
342 CRYPTO_THREAD_unlock(ex_data_lock);-
343-
344 for (i = 0; i < mx; i++) {
i < mxDescription
TRUEevaluated 512701 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 387623 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
387623-512701
345 if (storage != NULL)
storage != ((void *)0)Description
TRUEevaluated 512701 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-512701
346 f = storage[i];
executed 512701 times by 1 test: f = storage[i];
Executed by:
  • libcrypto.so.1.1
512701
347 else {-
348 CRYPTO_THREAD_write_lock(ex_data_lock);-
349 f = sk_EX_CALLBACK_value(ip->meth, i);-
350 CRYPTO_THREAD_unlock(ex_data_lock);-
351 }
never executed: end of block
0
352 if (f != NULL && f->free_func != NULL) {
f != ((void *)0)Description
TRUEevaluated 500383 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 12318 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
f->free_func != ((void *)0)Description
TRUEevaluated 744 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 499639 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
744-500383
353 ptr = CRYPTO_get_ex_data(ad, i);-
354 f->free_func(obj, ptr, ad, i, f->argl, f->argp);-
355 }
executed 744 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
744
356 }
executed 512701 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
512701
357-
358 if (storage != stack)
storage != stackDescription
TRUEevaluated 377377 times by 12 tests
Evaluated by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
FALSEevaluated 10246 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
10246-377377
359 OPENSSL_free(storage);
executed 377377 times by 12 tests: CRYPTO_free(storage, __FILE__, 359);
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
377377
360 err:
code before this statement executed 387623 times by 12 tests: err:
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
387623
361 sk_void_free(ad->sk);-
362 ad->sk = NULL;-
363}
executed 387623 times by 12 tests: end of block
Executed by:
  • asn1_internal_test
  • chacha_internal_test
  • ctype_internal_test
  • curve448_internal_test
  • libcrypto.so.1.1
  • modes_internal_test
  • poly1305_internal_test
  • rdrand_sanitytest
  • siphash_internal_test
  • sm2_internal_test
  • sm4_internal_test
  • x509_internal_test
387623
364-
365/*-
366 * For a given CRYPTO_EX_DATA variable, set the value corresponding to a-
367 * particular index in the class used by this variable-
368 */-
369int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val)-
370{-
371 int i;-
372-
373 if (ad->sk == NULL) {
ad->sk == ((void *)0)Description
TRUEevaluated 9787 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 14 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
14-9787
374 if ((ad->sk = sk_void_new_null()) == NULL) {
(ad->sk = sk_v...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 9787 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-9787
375 CRYPTOerr(CRYPTO_F_CRYPTO_SET_EX_DATA, ERR_R_MALLOC_FAILURE);-
376 return 0;
never executed: return 0;
0
377 }-
378 }
executed 9787 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
9787
379-
380 for (i = sk_void_num(ad->sk); i <= idx; ++i) {
i <= idxDescription
TRUEevaluated 507639 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 9801 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
9801-507639
381 if (!sk_void_push(ad->sk, NULL)) {
!sk_void_push(... ((void *)0) )Description
TRUEnever evaluated
FALSEevaluated 507639 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-507639
382 CRYPTOerr(CRYPTO_F_CRYPTO_SET_EX_DATA, ERR_R_MALLOC_FAILURE);-
383 return 0;
never executed: return 0;
0
384 }-
385 }
executed 507639 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
507639
386 sk_void_set(ad->sk, idx, val);-
387 return 1;
executed 9801 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
9801
388}-
389-
390/*-
391 * For a given CRYPTO_EX_DATA_ variable, get the value corresponding to a-
392 * particular index in the class used by this variable-
393 */-
394void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad, int idx)-
395{-
396 if (ad->sk == NULL || idx >= sk_void_num(ad->sk))
ad->sk == ((void *)0)Description
TRUEevaluated 1112 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 16985 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
idx >= sk_void_num(ad->sk)Description
TRUEnever evaluated
FALSEevaluated 16985 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-16985
397 return NULL;
executed 1112 times by 1 test: return ((void *)0) ;
Executed by:
  • libcrypto.so.1.1
1112
398 return sk_void_value(ad->sk, idx);
executed 16985 times by 1 test: return sk_void_value(ad->sk, idx);
Executed by:
  • libcrypto.so.1.1
16985
399}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2