OpenCoverage

x509_att.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/x509/x509_att.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: x509_att.c,v 1.17 2018/05/18 19:21:33 tb Exp $ */-
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)-
3 * All rights reserved.-
4 *-
5 * This package is an SSL implementation written-
6 * by Eric Young (eay@cryptsoft.com).-
7 * The implementation was written so as to conform with Netscapes SSL.-
8 *-
9 * This library is free for commercial and non-commercial use as long as-
10 * the following conditions are aheared to. The following conditions-
11 * apply to all code found in this distribution, be it the RC4, RSA,-
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation-
13 * included with this distribution is covered by the same copyright terms-
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com).-
15 *-
16 * Copyright remains Eric Young's, and as such any Copyright notices in-
17 * the code are not to be removed.-
18 * If this package is used in a product, Eric Young should be given attribution-
19 * as the author of the parts of the library used.-
20 * This can be in the form of a textual message at program startup or-
21 * in documentation (online or textual) provided with the package.-
22 *-
23 * Redistribution and use in source and binary forms, with or without-
24 * modification, are permitted provided that the following conditions-
25 * are met:-
26 * 1. Redistributions of source code must retain the copyright-
27 * notice, this list of conditions and the following disclaimer.-
28 * 2. Redistributions in binary form must reproduce the above copyright-
29 * notice, this list of conditions and the following disclaimer in the-
30 * documentation and/or other materials provided with the distribution.-
31 * 3. All advertising materials mentioning features or use of this software-
32 * must display the following acknowledgement:-
33 * "This product includes cryptographic software written by-
34 * Eric Young (eay@cryptsoft.com)"-
35 * The word 'cryptographic' can be left out if the rouines from the library-
36 * being used are not cryptographic related :-).-
37 * 4. If you include any Windows specific code (or a derivative thereof) from-
38 * the apps directory (application code) you must include an acknowledgement:-
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"-
40 *-
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND-
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE-
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE-
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL-
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS-
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)-
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT-
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY-
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF-
51 * SUCH DAMAGE.-
52 *-
53 * The licence and distribution terms for any publically available version or-
54 * derivative of this code cannot be changed. i.e. this code cannot simply be-
55 * copied and put under another distribution licence-
56 * [including the GNU Public Licence.]-
57 */-
58-
59#include <stdio.h>-
60-
61#include <openssl/asn1.h>-
62#include <openssl/err.h>-
63#include <openssl/evp.h>-
64#include <openssl/objects.h>-
65#include <openssl/stack.h>-
66#include <openssl/x509.h>-
67#include <openssl/x509v3.h>-
68-
69int-
70X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x)-
71{-
72 return sk_X509_ATTRIBUTE_num(x);
never executed: return sk_num(((_STACK*) (1 ? (x) : (struct stack_st_X509_ATTRIBUTE*)0)));
0
73}-
74-
75int-
76X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid, int lastpos)-
77{-
78 ASN1_OBJECT *obj;-
79-
80 obj = OBJ_nid2obj(nid);-
81 if (obj == NULL)
obj == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
82 return (-2);
never executed: return (-2);
0
83 return (X509at_get_attr_by_OBJ(x, obj, lastpos));
never executed: return (X509at_get_attr_by_OBJ(x, obj, lastpos));
0
84}-
85-
86int-
87X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk,-
88 const ASN1_OBJECT *obj, int lastpos)-
89{-
90 int n;-
91 X509_ATTRIBUTE *ex;-
92-
93 if (sk == NULL)
sk == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
94 return (-1);
never executed: return (-1);
0
95 lastpos++;-
96 if (lastpos < 0)
lastpos < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
97 lastpos = 0;
never executed: lastpos = 0;
0
98 n = sk_X509_ATTRIBUTE_num(sk);-
99 for (; lastpos < n; lastpos++) {
lastpos < nDescription
TRUEnever evaluated
FALSEnever evaluated
0
100 ex = sk_X509_ATTRIBUTE_value(sk, lastpos);-
101 if (OBJ_cmp(ex->object, obj) == 0)
OBJ_cmp(ex->object, obj) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
102 return (lastpos);
never executed: return (lastpos);
0
103 }
never executed: end of block
0
104 return (-1);
never executed: return (-1);
0
105}-
106-
107X509_ATTRIBUTE *-
108X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc)-
109{-
110 if (x == NULL || sk_X509_ATTRIBUTE_num(x) <= loc || loc < 0)
x == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
sk_num(((_STAC...E*)0))) <= locDescription
TRUEnever evaluated
FALSEnever evaluated
loc < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
111 return NULL;
never executed: return ((void *)0) ;
0
112 else-
113 return sk_X509_ATTRIBUTE_value(x, loc);
never executed: return ((X509_ATTRIBUTE *)sk_value(((_STACK*) (1 ? (x) : (struct stack_st_X509_ATTRIBUTE*)0)), (loc)));
0
114}-
115-
116X509_ATTRIBUTE *-
117X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc)-
118{-
119 X509_ATTRIBUTE *ret;-
120-
121 if (x == NULL || sk_X509_ATTRIBUTE_num(x) <= loc || loc < 0)
x == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
sk_num(((_STAC...E*)0))) <= locDescription
TRUEnever evaluated
FALSEnever evaluated
loc < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
122 return (NULL);
never executed: return ( ((void *)0) );
0
123 ret = sk_X509_ATTRIBUTE_delete(x, loc);-
124 return (ret);
never executed: return (ret);
0
125}-
126-
127STACK_OF(X509_ATTRIBUTE) *-
128X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x, X509_ATTRIBUTE *attr)-
129{-
130 X509_ATTRIBUTE *new_attr = NULL;-
131 STACK_OF(X509_ATTRIBUTE) *sk = NULL;-
132-
133 if (x == NULL) {
x == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
134 X509error(ERR_R_PASSED_NULL_PARAMETER);-
135 return (NULL);
never executed: return ( ((void *)0) );
0
136 }-
137-
138 if (*x == NULL) {
*x == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
139 if ((sk = sk_X509_ATTRIBUTE_new_null()) == NULL)
(sk = ((struct...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
140 goto err;
never executed: goto err;
0
141 } else
never executed: end of block
0
142 sk = *x;
never executed: sk = *x;
0
143-
144 if ((new_attr = X509_ATTRIBUTE_dup(attr)) == NULL)
(new_attr = X5...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
145 goto err2;
never executed: goto err2;
0
146 if (!sk_X509_ATTRIBUTE_push(sk, new_attr))
!sk_push(((_ST...TTRIBUTE*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
147 goto err;
never executed: goto err;
0
148 if (*x == NULL)
*x == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
149 *x = sk;
never executed: *x = sk;
0
150 return (sk);
never executed: return (sk);
0
151-
152err:-
153 X509error(ERR_R_MALLOC_FAILURE);-
154err2:
code before this statement never executed: err2:
0
155 if (new_attr != NULL)
new_attr != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
156 X509_ATTRIBUTE_free(new_attr);
never executed: X509_ATTRIBUTE_free(new_attr);
0
157 if (sk != NULL && sk != *x)
sk != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
sk != *xDescription
TRUEnever evaluated
FALSEnever evaluated
0
158 sk_X509_ATTRIBUTE_free(sk);
never executed: sk_free(((_STACK*) (1 ? (sk) : (struct stack_st_X509_ATTRIBUTE*)0)));
0
159 return (NULL);
never executed: return ( ((void *)0) );
0
160}-
161-
162STACK_OF(X509_ATTRIBUTE) *-
163X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x, const ASN1_OBJECT *obj,-
164 int type, const unsigned char *bytes, int len)-
165{-
166 X509_ATTRIBUTE *attr;-
167 STACK_OF(X509_ATTRIBUTE) *ret;-
168-
169 attr = X509_ATTRIBUTE_create_by_OBJ(NULL, obj, type, bytes, len);-
170 if (!attr)
!attrDescription
TRUEnever evaluated
FALSEnever evaluated
0
171 return 0;
never executed: return 0;
0
172 ret = X509at_add1_attr(x, attr);-
173 X509_ATTRIBUTE_free(attr);-
174 return ret;
never executed: return ret;
0
175}-
176-
177STACK_OF(X509_ATTRIBUTE) *-
178X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x, int nid, int type,-
179 const unsigned char *bytes, int len)-
180{-
181 X509_ATTRIBUTE *attr;-
182 STACK_OF(X509_ATTRIBUTE) *ret;-
183-
184 attr = X509_ATTRIBUTE_create_by_NID(NULL, nid, type, bytes, len);-
185 if (!attr)
!attrDescription
TRUEnever evaluated
FALSEnever evaluated
0
186 return 0;
never executed: return 0;
0
187 ret = X509at_add1_attr(x, attr);-
188 X509_ATTRIBUTE_free(attr);-
189 return ret;
never executed: return ret;
0
190}-
191-
192STACK_OF(X509_ATTRIBUTE) *-
193X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x, const char *attrname,-
194 int type, const unsigned char *bytes, int len)-
195{-
196 X509_ATTRIBUTE *attr;-
197 STACK_OF(X509_ATTRIBUTE) *ret;-
198-
199 attr = X509_ATTRIBUTE_create_by_txt(NULL, attrname, type, bytes, len);-
200 if (!attr)
!attrDescription
TRUEnever evaluated
FALSEnever evaluated
0
201 return 0;
never executed: return 0;
0
202 ret = X509at_add1_attr(x, attr);-
203 X509_ATTRIBUTE_free(attr);-
204 return ret;
never executed: return ret;
0
205}-
206-
207void *-
208X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x, const ASN1_OBJECT *obj,-
209 int lastpos, int type)-
210{-
211 int i;-
212 X509_ATTRIBUTE *at;-
213-
214 i = X509at_get_attr_by_OBJ(x, obj, lastpos);-
215 if (i == -1)
i == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
216 return NULL;
never executed: return ((void *)0) ;
0
217 if ((lastpos <= -2) && (X509at_get_attr_by_OBJ(x, obj, i) != -1))
(lastpos <= -2)Description
TRUEnever evaluated
FALSEnever evaluated
(X509at_get_at...obj, i) != -1)Description
TRUEnever evaluated
FALSEnever evaluated
0
218 return NULL;
never executed: return ((void *)0) ;
0
219 at = X509at_get_attr(x, i);-
220 if (lastpos <= -3 && (X509_ATTRIBUTE_count(at) != 1))
lastpos <= -3Description
TRUEnever evaluated
FALSEnever evaluated
(X509_ATTRIBUT...ount(at) != 1)Description
TRUEnever evaluated
FALSEnever evaluated
0
221 return NULL;
never executed: return ((void *)0) ;
0
222 return X509_ATTRIBUTE_get0_data(at, 0, type, NULL);
never executed: return X509_ATTRIBUTE_get0_data(at, 0, type, ((void *)0) );
0
223}-
224-
225X509_ATTRIBUTE *-
226X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid, int atrtype,-
227 const void *data, int len)-
228{-
229 ASN1_OBJECT *obj;-
230 X509_ATTRIBUTE *ret;-
231-
232 obj = OBJ_nid2obj(nid);-
233 if (obj == NULL) {
obj == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
234 X509error(X509_R_UNKNOWN_NID);-
235 return (NULL);
never executed: return ( ((void *)0) );
0
236 }-
237 ret = X509_ATTRIBUTE_create_by_OBJ(attr, obj, atrtype, data, len);-
238 if (ret == NULL)
ret == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
239 ASN1_OBJECT_free(obj);
never executed: ASN1_OBJECT_free(obj);
0
240 return (ret);
never executed: return (ret);
0
241}-
242-
243X509_ATTRIBUTE *-
244X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr, const ASN1_OBJECT *obj,-
245 int atrtype, const void *data, int len)-
246{-
247 X509_ATTRIBUTE *ret;-
248-
249 if ((attr == NULL) || (*attr == NULL)) {
(attr == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
(*attr == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
250 if ((ret = X509_ATTRIBUTE_new()) == NULL) {
(ret = X509_AT...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
251 X509error(ERR_R_MALLOC_FAILURE);-
252 return (NULL);
never executed: return ( ((void *)0) );
0
253 }-
254 } else
never executed: end of block
0
255 ret= *attr;
never executed: ret= *attr;
0
256-
257 if (!X509_ATTRIBUTE_set1_object(ret, obj))
!X509_ATTRIBUT...ject(ret, obj)Description
TRUEnever evaluated
FALSEnever evaluated
0
258 goto err;
never executed: goto err;
0
259 if (!X509_ATTRIBUTE_set1_data(ret, atrtype, data, len))
!X509_ATTRIBUT...pe, data, len)Description
TRUEnever evaluated
FALSEnever evaluated
0
260 goto err;
never executed: goto err;
0
261-
262 if ((attr != NULL) && (*attr == NULL))
(attr != ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
(*attr == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
263 *attr = ret;
never executed: *attr = ret;
0
264 return (ret);
never executed: return (ret);
0
265-
266err:-
267 if ((attr == NULL) || (ret != *attr))
(attr == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
(ret != *attr)Description
TRUEnever evaluated
FALSEnever evaluated
0
268 X509_ATTRIBUTE_free(ret);
never executed: X509_ATTRIBUTE_free(ret);
0
269 return (NULL);
never executed: return ( ((void *)0) );
0
270}-
271-
272X509_ATTRIBUTE *-
273X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr, const char *atrname,-
274 int type, const unsigned char *bytes, int len)-
275{-
276 ASN1_OBJECT *obj;-
277 X509_ATTRIBUTE *nattr;-
278-
279 obj = OBJ_txt2obj(atrname, 0);-
280 if (obj == NULL) {
obj == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
281 X509error(X509_R_INVALID_FIELD_NAME);-
282 ERR_asprintf_error_data("name=%s", atrname);-
283 return (NULL);
never executed: return ( ((void *)0) );
0
284 }-
285 nattr = X509_ATTRIBUTE_create_by_OBJ(attr, obj, type, bytes, len);-
286 ASN1_OBJECT_free(obj);-
287 return nattr;
never executed: return nattr;
0
288}-
289-
290int-
291X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj)-
292{-
293 if ((attr == NULL) || (obj == NULL))
(attr == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
(obj == ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
294 return (0);
never executed: return (0);
0
295 ASN1_OBJECT_free(attr->object);-
296 attr->object = OBJ_dup(obj);-
297 return attr->object != NULL;
never executed: return attr->object != ((void *)0) ;
0
298}-
299-
300int-
301X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data,-
302 int len)-
303{-
304 ASN1_TYPE *ttmp = NULL;-
305 ASN1_STRING *stmp = NULL;-
306 int atype = 0;-
307-
308 if (!attr)
!attrDescription
TRUEnever evaluated
FALSEnever evaluated
0
309 return 0;
never executed: return 0;
0
310 if (attrtype & MBSTRING_FLAG) {
attrtype & 0x1000Description
TRUEnever evaluated
FALSEnever evaluated
0
311 stmp = ASN1_STRING_set_by_NID(NULL, data, len, attrtype,-
312 OBJ_obj2nid(attr->object));-
313 if (!stmp) {
!stmpDescription
TRUEnever evaluated
FALSEnever evaluated
0
314 X509error(ERR_R_ASN1_LIB);-
315 return 0;
never executed: return 0;
0
316 }-
317 atype = stmp->type;-
318 } else if (len != -1){
never executed: end of block
len != -1Description
TRUEnever evaluated
FALSEnever evaluated
0
319 if (!(stmp = ASN1_STRING_type_new(attrtype)))
!(stmp = ASN1_...new(attrtype))Description
TRUEnever evaluated
FALSEnever evaluated
0
320 goto err;
never executed: goto err;
0
321 if (!ASN1_STRING_set(stmp, data, len))
!ASN1_STRING_s...mp, data, len)Description
TRUEnever evaluated
FALSEnever evaluated
0
322 goto err;
never executed: goto err;
0
323 atype = attrtype;-
324 }
never executed: end of block
0
325 if (!(attr->value.set = sk_ASN1_TYPE_new_null()))
!(attr->value....k_new_null()))Description
TRUEnever evaluated
FALSEnever evaluated
0
326 goto err;
never executed: goto err;
0
327 attr->single = 0;-
328 /* This is a bit naughty because the attribute should really have-
329 * at least one value but some types use and zero length SET and-
330 * require this.-
331 */-
332 if (attrtype == 0) {
attrtype == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
333 ASN1_STRING_free(stmp);-
334 return 1;
never executed: return 1;
0
335 }-
336-
337 if (!(ttmp = ASN1_TYPE_new()))
!(ttmp = ASN1_TYPE_new())Description
TRUEnever evaluated
FALSEnever evaluated
0
338 goto err;
never executed: goto err;
0
339 if ((len == -1) && !(attrtype & MBSTRING_FLAG)) {
(len == -1)Description
TRUEnever evaluated
FALSEnever evaluated
!(attrtype & 0x1000)Description
TRUEnever evaluated
FALSEnever evaluated
0
340 if (!ASN1_TYPE_set1(ttmp, attrtype, data))
!ASN1_TYPE_set...ttrtype, data)Description
TRUEnever evaluated
FALSEnever evaluated
0
341 goto err;
never executed: goto err;
0
342 } else
never executed: end of block
0
343 ASN1_TYPE_set(ttmp, atype, stmp);
never executed: ASN1_TYPE_set(ttmp, atype, stmp);
0
344 if (!sk_ASN1_TYPE_push(attr->value.set, ttmp))
!sk_push(((_ST...SN1_TYPE*)0)))Description
TRUEnever evaluated
FALSEnever evaluated
0
345 goto err;
never executed: goto err;
0
346 return 1;
never executed: return 1;
0
347-
348err:-
349 ASN1_TYPE_free(ttmp);-
350 ASN1_STRING_free(stmp);-
351 X509error(ERR_R_MALLOC_FAILURE);-
352 return 0;
never executed: return 0;
0
353}-
354-
355int-
356X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr)-
357{-
358 if (!attr->single)
!attr->singleDescription
TRUEnever evaluated
FALSEnever evaluated
0
359 return sk_ASN1_TYPE_num(attr->value.set);
never executed: return sk_num(((_STACK*) (1 ? (attr->value.set) : (struct stack_st_ASN1_TYPE*)0)));
0
360 if (attr->value.single)
attr->value.singleDescription
TRUEnever evaluated
FALSEnever evaluated
0
361 return 1;
never executed: return 1;
0
362 return 0;
never executed: return 0;
0
363}-
364-
365ASN1_OBJECT *-
366X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr)-
367{-
368 if (attr == NULL)
attr == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
369 return (NULL);
never executed: return ( ((void *)0) );
0
370 return (attr->object);
never executed: return (attr->object);
0
371}-
372-
373void *-
374X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype, void *data)-
375{-
376 ASN1_TYPE *ttmp;-
377-
378 ttmp = X509_ATTRIBUTE_get0_type(attr, idx);-
379 if (!ttmp)
!ttmpDescription
TRUEnever evaluated
FALSEnever evaluated
0
380 return NULL;
never executed: return ((void *)0) ;
0
381 if (atrtype != ASN1_TYPE_get(ttmp)){
atrtype != ASN1_TYPE_get(ttmp)Description
TRUEnever evaluated
FALSEnever evaluated
0
382 X509error(X509_R_WRONG_TYPE);-
383 return NULL;
never executed: return ((void *)0) ;
0
384 }-
385 return ttmp->value.ptr;
never executed: return ttmp->value.ptr;
0
386}-
387-
388ASN1_TYPE *-
389X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx)-
390{-
391 if (attr == NULL)
attr == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
392 return (NULL);
never executed: return ( ((void *)0) );
0
393 if (idx >= X509_ATTRIBUTE_count(attr))
idx >= X509_AT...TE_count(attr)Description
TRUEnever evaluated
FALSEnever evaluated
0
394 return NULL;
never executed: return ((void *)0) ;
0
395 if (!attr->single)
!attr->singleDescription
TRUEnever evaluated
FALSEnever evaluated
0
396 return sk_ASN1_TYPE_value(attr->value.set, idx);
never executed: return ((ASN1_TYPE *)sk_value(((_STACK*) (1 ? (attr->value.set) : (struct stack_st_ASN1_TYPE*)0)), (idx)));
0
397 else-
398 return attr->value.single;
never executed: return attr->value.single;
0
399}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2