OpenCoverage

asn_mime.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssl/src/crypto/asn1/asn_mime.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2 * Copyright 2008-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 <stdio.h>-
11#include "internal/ctype.h"-
12#include "internal/cryptlib.h"-
13#include <openssl/rand.h>-
14#include <openssl/x509.h>-
15#include <openssl/asn1.h>-
16#include <openssl/asn1t.h>-
17#include "internal/evp_int.h"-
18#include "internal/bio.h"-
19#include "asn1_locl.h"-
20-
21/*-
22 * Generalised MIME like utilities for streaming ASN1. Although many have a-
23 * PKCS7/CMS like flavour others are more general purpose.-
24 */-
25-
26/*-
27 * MIME format structures Note that all are translated to lower case apart-
28 * from parameter values. Quotes are stripped off-
29 */-
30-
31struct mime_param_st {-
32 char *param_name; /* Param name e.g. "micalg" */-
33 char *param_value; /* Param value e.g. "sha1" */-
34};-
35-
36struct mime_header_st {-
37 char *name; /* Name of line e.g. "content-type" */-
38 char *value; /* Value of line e.g. "text/plain" */-
39 STACK_OF(MIME_PARAM) *params; /* Zero or more parameters */-
40};-
41-
42static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags,-
43 const ASN1_ITEM *it);-
44static char *strip_ends(char *name);-
45static char *strip_start(char *name);-
46static char *strip_end(char *name);-
47static MIME_HEADER *mime_hdr_new(const char *name, const char *value);-
48static int mime_hdr_addparam(MIME_HEADER *mhdr, const char *name, const char *value);-
49static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio);-
50static int mime_hdr_cmp(const MIME_HEADER *const *a,-
51 const MIME_HEADER *const *b);-
52static int mime_param_cmp(const MIME_PARAM *const *a,-
53 const MIME_PARAM *const *b);-
54static void mime_param_free(MIME_PARAM *param);-
55static int mime_bound_check(char *line, int linelen, const char *bound, int blen);-
56static int multi_split(BIO *bio, const char *bound, STACK_OF(BIO) **ret);-
57static int strip_eol(char *linebuf, int *plen, int flags);-
58static MIME_HEADER *mime_hdr_find(STACK_OF(MIME_HEADER) *hdrs, const char *name);-
59static MIME_PARAM *mime_param_find(MIME_HEADER *hdr, const char *name);-
60static void mime_hdr_free(MIME_HEADER *hdr);-
61-
62#define MAX_SMLEN 1024-
63#define mime_debug(x) /* x */-
64-
65/* Output an ASN1 structure in BER format streaming if necessary */-
66-
67int i2d_ASN1_bio_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags,-
68 const ASN1_ITEM *it)-
69{-
70 /* If streaming create stream BIO and copy all content through it */-
71 if (flags & SMIME_STREAM) {
flags & 0x1000Description
TRUEevaluated 45 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 26 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
26-45
72 BIO *bio, *tbio;-
73 bio = BIO_new_NDEF(out, val, it);-
74 if (!bio) {
!bioDescription
TRUEnever evaluated
FALSEevaluated 45 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-45
75 ASN1err(ASN1_F_I2D_ASN1_BIO_STREAM, ERR_R_MALLOC_FAILURE);-
76 return 0;
never executed: return 0;
0
77 }-
78 SMIME_crlf_copy(in, bio, flags);-
79 (void)BIO_flush(bio);-
80 /* Free up successive BIOs until we hit the old output BIO */-
81 do {-
82 tbio = BIO_pop(bio);-
83 BIO_free(bio);-
84 bio = tbio;-
85 } while (bio != out);
executed 89 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
bio != outDescription
TRUEevaluated 44 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 45 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
44-89
86 }
executed 45 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
45
87 /*-
88 * else just write out ASN1 structure which will have all content stored-
89 * internally-
90 */-
91 else-
92 ASN1_item_i2d_bio(it, out, val);
executed 26 times by 1 test: ASN1_item_i2d_bio(it, out, val);
Executed by:
  • libcrypto.so.1.1
26
93 return 1;
executed 71 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
71
94}-
95-
96/* Base 64 read and write of ASN1 structure */-
97-
98static int B64_write_ASN1(BIO *out, ASN1_VALUE *val, BIO *in, int flags,-
99 const ASN1_ITEM *it)-
100{-
101 BIO *b64;-
102 int r;-
103 b64 = BIO_new(BIO_f_base64());-
104 if (b64 == NULL) {
b64 == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 43 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-43
105 ASN1err(ASN1_F_B64_WRITE_ASN1, ERR_R_MALLOC_FAILURE);-
106 return 0;
never executed: return 0;
0
107 }-
108 /*-
109 * prepend the b64 BIO so all data is base64 encoded.-
110 */-
111 out = BIO_push(b64, out);-
112 r = i2d_ASN1_bio_stream(out, val, in, flags, it);-
113 (void)BIO_flush(out);-
114 BIO_pop(out);-
115 BIO_free(b64);-
116 return r;
executed 43 times by 1 test: return r;
Executed by:
  • libcrypto.so.1.1
43
117}-
118-
119/* Streaming ASN1 PEM write */-
120-
121int PEM_write_bio_ASN1_stream(BIO *out, ASN1_VALUE *val, BIO *in, int flags,-
122 const char *hdr, const ASN1_ITEM *it)-
123{-
124 int r;-
125 BIO_printf(out, "-----BEGIN %s-----\n", hdr);-
126 r = B64_write_ASN1(out, val, in, flags, it);-
127 BIO_printf(out, "-----END %s-----\n", hdr);-
128 return r;
executed 11 times by 1 test: return r;
Executed by:
  • libcrypto.so.1.1
11
129}-
130-
131static ASN1_VALUE *b64_read_asn1(BIO *bio, const ASN1_ITEM *it)-
132{-
133 BIO *b64;-
134 ASN1_VALUE *val;-
135-
136 if ((b64 = BIO_new(BIO_f_base64())) == NULL) {
(b64 = BIO_new...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 34 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-34
137 ASN1err(ASN1_F_B64_READ_ASN1, ERR_R_MALLOC_FAILURE);-
138 return 0;
never executed: return 0;
0
139 }-
140 bio = BIO_push(b64, bio);-
141 val = ASN1_item_d2i_bio(it, bio, NULL);-
142 if (!val)
!valDescription
TRUEnever evaluated
FALSEevaluated 34 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-34
143 ASN1err(ASN1_F_B64_READ_ASN1, ASN1_R_DECODE_ERROR);
never executed: ERR_put_error(13,(209),(110),__FILE__,143);
0
144 (void)BIO_flush(bio);-
145 BIO_pop(bio);-
146 BIO_free(b64);-
147 return val;
executed 34 times by 1 test: return val;
Executed by:
  • libcrypto.so.1.1
34
148}-
149-
150/* Generate the MIME "micalg" parameter from RFC3851, RFC4490 */-
151-
152static int asn1_write_micalg(BIO *out, STACK_OF(X509_ALGOR) *mdalgs)-
153{-
154 const EVP_MD *md;-
155 int i, have_unknown = 0, write_comma, ret = 0, md_nid;-
156 have_unknown = 0;-
157 write_comma = 0;-
158 for (i = 0; i < sk_X509_ALGOR_num(mdalgs); i++) {
i < sk_X509_ALGOR_num(mdalgs)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
6
159 if (write_comma)
write_commaDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
160 BIO_write(out, ",", 1);
never executed: BIO_write(out, ",", 1);
0
161 write_comma = 1;-
162 md_nid = OBJ_obj2nid(sk_X509_ALGOR_value(mdalgs, i)->algorithm);-
163 md = EVP_get_digestbynid(md_nid);-
164 if (md && md->md_ctrl) {
mdDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
md->md_ctrlDescription
TRUEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
165 int rv;-
166 char *micstr;-
167 rv = md->md_ctrl(NULL, EVP_MD_CTRL_MICALG, 0, &micstr);-
168 if (rv > 0) {
rv > 0Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
169 BIO_puts(out, micstr);-
170 OPENSSL_free(micstr);-
171 continue;
never executed: continue;
0
172 }-
173 if (rv != -2)
rv != -2Description
TRUEnever evaluated
FALSEevaluated 3 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-3
174 goto err;
never executed: goto err;
0
175 }
executed 3 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
3
176 switch (md_nid) {-
177 case NID_sha1:
executed 3 times by 1 test: case 64:
Executed by:
  • libcrypto.so.1.1
3
178 BIO_puts(out, "sha1");-
179 break;
executed 3 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
3
180-
181 case NID_md5:
never executed: case 4:
0
182 BIO_puts(out, "md5");-
183 break;
never executed: break;
0
184-
185 case NID_sha256:
executed 3 times by 1 test: case 672:
Executed by:
  • libcrypto.so.1.1
3
186 BIO_puts(out, "sha-256");-
187 break;
executed 3 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
3
188-
189 case NID_sha384:
never executed: case 673:
0
190 BIO_puts(out, "sha-384");-
191 break;
never executed: break;
0
192-
193 case NID_sha512:
never executed: case 674:
0
194 BIO_puts(out, "sha-512");-
195 break;
never executed: break;
0
196-
197 case NID_id_GostR3411_94:
never executed: case 809:
0
198 BIO_puts(out, "gostr3411-94");-
199 goto err;
never executed: goto err;
0
200-
201 default:
never executed: default:
0
202 if (have_unknown)
have_unknownDescription
TRUEnever evaluated
FALSEnever evaluated
0
203 write_comma = 0;
never executed: write_comma = 0;
0
204 else {-
205 BIO_puts(out, "unknown");-
206 have_unknown = 1;-
207 }
never executed: end of block
0
208 break;
never executed: break;
0
209-
210 }-
211 }-
212-
213 ret = 1;-
214 err:
code before this statement executed 6 times by 1 test: err:
Executed by:
  • libcrypto.so.1.1
6
215-
216 return ret;
executed 6 times by 1 test: return ret;
Executed by:
  • libcrypto.so.1.1
6
217-
218}-
219-
220/* SMIME sender */-
221-
222int SMIME_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags,-
223 int ctype_nid, int econt_nid,-
224 STACK_OF(X509_ALGOR) *mdalgs, const ASN1_ITEM *it)-
225{-
226 char bound[33], c;-
227 int i;-
228 const char *mime_prefix, *mime_eol, *cname = "smime.p7m";-
229 const char *msg_type = NULL;-
230 if (flags & SMIME_OLDMIME)
flags & 0x400Description
TRUEevaluated 7 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 25 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
7-25
231 mime_prefix = "application/x-pkcs7-";
executed 7 times by 1 test: mime_prefix = "application/x-pkcs7-";
Executed by:
  • libcrypto.so.1.1
7
232 else-
233 mime_prefix = "application/pkcs7-";
executed 25 times by 1 test: mime_prefix = "application/pkcs7-";
Executed by:
  • libcrypto.so.1.1
25
234-
235 if (flags & SMIME_CRLFEOL)
flags & 0x800Description
TRUEnever evaluated
FALSEevaluated 32 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-32
236 mime_eol = "\r\n";
never executed: mime_eol = "\r\n";
0
237 else-
238 mime_eol = "\n";
executed 32 times by 1 test: mime_eol = "\n";
Executed by:
  • libcrypto.so.1.1
32
239 if ((flags & SMIME_DETACHED) && data) {
(flags & 0x40)Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 26 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
dataDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-26
240 /* We want multipart/signed */-
241 /* Generate a random boundary */-
242 if (RAND_bytes((unsigned char *)bound, 32) <= 0)
RAND_bytes((un...ound, 32) <= 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
243 return 0;
never executed: return 0;
0
244 for (i = 0; i < 32; i++) {
i < 32Description
TRUEevaluated 192 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
6-192
245 c = bound[i] & 0xf;-
246 if (c < 10)
c < 10Description
TRUEevaluated 122 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 70 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
70-122
247 c += '0';
executed 122 times by 1 test: c += '0';
Executed by:
  • libcrypto.so.1.1
122
248 else-
249 c += 'A' - 10;
executed 70 times by 1 test: c += 'A' - 10;
Executed by:
  • libcrypto.so.1.1
70
250 bound[i] = c;-
251 }
executed 192 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
192
252 bound[32] = 0;-
253 BIO_printf(bio, "MIME-Version: 1.0%s", mime_eol);-
254 BIO_printf(bio, "Content-Type: multipart/signed;");-
255 BIO_printf(bio, " protocol=\"%ssignature\";", mime_prefix);-
256 BIO_puts(bio, " micalg=\"");-
257 asn1_write_micalg(bio, mdalgs);-
258 BIO_printf(bio, "\"; boundary=\"----%s\"%s%s",-
259 bound, mime_eol, mime_eol);-
260 BIO_printf(bio, "This is an S/MIME signed message%s%s",-
261 mime_eol, mime_eol);-
262 /* Now write out the first part */-
263 BIO_printf(bio, "------%s%s", bound, mime_eol);-
264 if (!asn1_output_data(bio, data, val, flags, it))
!asn1_output_d...al, flags, it)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
265 return 0;
never executed: return 0;
0
266 BIO_printf(bio, "%s------%s%s", mime_eol, bound, mime_eol);-
267-
268 /* Headers for signature */-
269-
270 BIO_printf(bio, "Content-Type: %ssignature;", mime_prefix);-
271 BIO_printf(bio, " name=\"smime.p7s\"%s", mime_eol);-
272 BIO_printf(bio, "Content-Transfer-Encoding: base64%s", mime_eol);-
273 BIO_printf(bio, "Content-Disposition: attachment;");-
274 BIO_printf(bio, " filename=\"smime.p7s\"%s%s", mime_eol, mime_eol);-
275 B64_write_ASN1(bio, val, NULL, 0, it);-
276 BIO_printf(bio, "%s------%s--%s%s", mime_eol, bound,-
277 mime_eol, mime_eol);-
278 return 1;
executed 6 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
6
279 }-
280-
281 /* Determine smime-type header */-
282-
283 if (ctype_nid == NID_pkcs7_enveloped)
ctype_nid == 23Description
TRUEevaluated 21 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 5 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
5-21
284 msg_type = "enveloped-data";
executed 21 times by 1 test: msg_type = "enveloped-data";
Executed by:
  • libcrypto.so.1.1
21
285 else if (ctype_nid == NID_pkcs7_signed) {
ctype_nid == 22Description
TRUEevaluated 5 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-5
286 if (econt_nid == NID_id_smime_ct_receipt)
econt_nid == 204Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-4
287 msg_type = "signed-receipt";
executed 1 time by 1 test: msg_type = "signed-receipt";
Executed by:
  • libcrypto.so.1.1
1
288 else if (sk_X509_ALGOR_num(mdalgs) >= 0)
sk_X509_ALGOR_num(mdalgs) >= 0Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-4
289 msg_type = "signed-data";
executed 4 times by 1 test: msg_type = "signed-data";
Executed by:
  • libcrypto.so.1.1
4
290 else-
291 msg_type = "certs-only";
never executed: msg_type = "certs-only";
0
292 } else if (ctype_nid == NID_id_smime_ct_compressedData) {
ctype_nid == 786Description
TRUEnever evaluated
FALSEnever evaluated
0
293 msg_type = "compressed-data";-
294 cname = "smime.p7z";-
295 }
never executed: end of block
0
296 /* MIME headers */-
297 BIO_printf(bio, "MIME-Version: 1.0%s", mime_eol);-
298 BIO_printf(bio, "Content-Disposition: attachment;");-
299 BIO_printf(bio, " filename=\"%s\"%s", cname, mime_eol);-
300 BIO_printf(bio, "Content-Type: %smime;", mime_prefix);-
301 if (msg_type)
msg_typeDescription
TRUEevaluated 26 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-26
302 BIO_printf(bio, " smime-type=%s;", msg_type);
executed 26 times by 1 test: BIO_printf(bio, " smime-type=%s;", msg_type);
Executed by:
  • libcrypto.so.1.1
26
303 BIO_printf(bio, " name=\"%s\"%s", cname, mime_eol);-
304 BIO_printf(bio, "Content-Transfer-Encoding: base64%s%s",-
305 mime_eol, mime_eol);-
306 if (!B64_write_ASN1(bio, val, data, flags, it))
!B64_write_ASN...ta, flags, it)Description
TRUEnever evaluated
FALSEevaluated 26 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-26
307 return 0;
never executed: return 0;
0
308 BIO_printf(bio, "%s", mime_eol);-
309 return 1;
executed 26 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
26
310}-
311-
312/* Handle output of ASN1 data */-
313-
314static int asn1_output_data(BIO *out, BIO *data, ASN1_VALUE *val, int flags,-
315 const ASN1_ITEM *it)-
316{-
317 BIO *tmpbio;-
318 const ASN1_AUX *aux = it->funcs;-
319 ASN1_STREAM_ARG sarg;-
320 int rv = 1;-
321-
322 /*-
323 * If data is not detached or resigning then the output BIO is already-
324 * set up to finalise when it is written through.-
325 */-
326 if (!(flags & SMIME_DETACHED) || (flags & PKCS7_REUSE_DIGEST)) {
!(flags & 0x40)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(flags & 0x8000)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
327 SMIME_crlf_copy(data, out, flags);-
328 return 1;
never executed: return 1;
0
329 }-
330-
331 if (!aux || !aux->asn1_cb) {
!auxDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
!aux->asn1_cbDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
332 ASN1err(ASN1_F_ASN1_OUTPUT_DATA, ASN1_R_STREAMING_NOT_SUPPORTED);-
333 return 0;
never executed: return 0;
0
334 }-
335-
336 sarg.out = out;-
337 sarg.ndef_bio = NULL;-
338 sarg.boundary = NULL;-
339-
340 /* Let ASN1 code prepend any needed BIOs */-
341-
342 if (aux->asn1_cb(ASN1_OP_DETACHED_PRE, &val, it, &sarg) <= 0)
aux->asn1_cb(1...t, &sarg) <= 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
343 return 0;
never executed: return 0;
0
344-
345 /* Copy data across, passing through filter BIOs for processing */-
346 SMIME_crlf_copy(data, sarg.ndef_bio, flags);-
347-
348 /* Finalize structure */-
349 if (aux->asn1_cb(ASN1_OP_DETACHED_POST, &val, it, &sarg) <= 0)
aux->asn1_cb(1...t, &sarg) <= 0Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
350 rv = 0;
never executed: rv = 0;
0
351-
352 /* Now remove any digests prepended to the BIO */-
353-
354 while (sarg.ndef_bio != out) {
sarg.ndef_bio != outDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
6
355 tmpbio = BIO_pop(sarg.ndef_bio);-
356 BIO_free(sarg.ndef_bio);-
357 sarg.ndef_bio = tmpbio;-
358 }
executed 6 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
6
359-
360 return rv;
executed 6 times by 1 test: return rv;
Executed by:
  • libcrypto.so.1.1
6
361-
362}-
363-
364/*-
365 * SMIME reader: handle multipart/signed and opaque signing. in multipart-
366 * case the content is placed in a memory BIO pointed to by "bcont". In-
367 * opaque this is set to NULL-
368 */-
369-
370ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it)-
371{-
372 BIO *asnin;-
373 STACK_OF(MIME_HEADER) *headers = NULL;-
374 STACK_OF(BIO) *parts = NULL;-
375 MIME_HEADER *hdr;-
376 MIME_PARAM *prm;-
377 ASN1_VALUE *val;-
378 int ret;-
379-
380 if (bcont)
bcontDescription
TRUEevaluated 33 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-33
381 *bcont = NULL;
executed 33 times by 1 test: *bcont = ((void *)0) ;
Executed by:
  • libcrypto.so.1.1
33
382-
383 if ((headers = mime_parse_hdr(bio)) == NULL) {
(headers = mim...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 34 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-34
384 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_MIME_PARSE_ERROR);-
385 return NULL;
never executed: return ((void *)0) ;
0
386 }-
387-
388 if ((hdr = mime_hdr_find(headers, "content-type")) == NULL
(hdr = mime_hd...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 34 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-34
389 || hdr->value == NULL) {
hdr->value == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 34 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-34
390 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
391 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_CONTENT_TYPE);-
392 return NULL;
never executed: return ((void *)0) ;
0
393 }-
394-
395 /* Handle multipart/signed */-
396-
397 if (strcmp(hdr->value, "multipart/signed") == 0) {
never executed: __result = (((const unsigned char *) (const char *) ( hdr->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "multipart/signed" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 28 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-28
398 /* Split into two parts */-
399 prm = mime_param_find(hdr, "boundary");-
400 if (!prm || !prm->param_value) {
!prmDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
!prm->param_valueDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
401 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
402 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_MULTIPART_BOUNDARY);-
403 return NULL;
never executed: return ((void *)0) ;
0
404 }-
405 ret = multi_split(bio, prm->param_value, &parts);-
406 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
407 if (!ret || (sk_BIO_num(parts) != 2)) {
!retDescription
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(sk_BIO_num(parts) != 2)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
408 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_MULTIPART_BODY_FAILURE);-
409 sk_BIO_pop_free(parts, BIO_vfree);-
410 return NULL;
never executed: return ((void *)0) ;
0
411 }-
412-
413 /* Parse the signature piece */-
414 asnin = sk_BIO_value(parts, 1);-
415-
416 if ((headers = mime_parse_hdr(asnin)) == NULL) {
(headers = mim...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
417 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_MIME_SIG_PARSE_ERROR);-
418 sk_BIO_pop_free(parts, BIO_vfree);-
419 return NULL;
never executed: return ((void *)0) ;
0
420 }-
421-
422 /* Get content type */-
423-
424 if ((hdr = mime_hdr_find(headers, "content-type")) == NULL
(hdr = mime_hd...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
425 || hdr->value == NULL) {
hdr->value == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
426 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
427 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_NO_SIG_CONTENT_TYPE);-
428 sk_BIO_pop_free(parts, BIO_vfree);-
429 return NULL;
never executed: return ((void *)0) ;
0
430 }-
431-
432 if (strcmp(hdr->value, "application/x-pkcs7-signature") &&
never executed: __result = (((const unsigned char *) (const char *) ( hdr->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "application/x-pkcs7-signature" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ...ture" )))); })Description
TRUEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-4
433 strcmp(hdr->value, "application/pkcs7-signature")) {
never executed: __result = (((const unsigned char *) (const char *) ( hdr->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "application/pkcs7-signature" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ...ture" )))); })Description
TRUEnever evaluated
FALSEevaluated 4 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-4
434 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_SIG_INVALID_MIME_TYPE);-
435 ERR_add_error_data(2, "type: ", hdr->value);-
436 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
437 sk_BIO_pop_free(parts, BIO_vfree);-
438 return NULL;
never executed: return ((void *)0) ;
0
439 }-
440 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
441 /* Read in ASN1 */-
442 if ((val = b64_read_asn1(asnin, it)) == NULL) {
(val = b64_rea...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
443 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_ASN1_SIG_PARSE_ERROR);-
444 sk_BIO_pop_free(parts, BIO_vfree);-
445 return NULL;
never executed: return ((void *)0) ;
0
446 }-
447-
448 if (bcont) {
bcontDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-6
449 *bcont = sk_BIO_value(parts, 0);-
450 BIO_free(asnin);-
451 sk_BIO_free(parts);-
452 } else
executed 6 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
6
453 sk_BIO_pop_free(parts, BIO_vfree);
never executed: sk_BIO_pop_free(parts, BIO_vfree);
0
454 return val;
executed 6 times by 1 test: return val;
Executed by:
  • libcrypto.so.1.1
6
455 }-
456-
457 /* OK, if not multipart/signed try opaque signature */-
458-
459 if (strcmp(hdr->value, "application/x-pkcs7-mime") &&
never executed: __result = (((const unsigned char *) (const char *) ( hdr->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "application/x-pkcs7-mime" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ...mime" )))); })Description
TRUEevaluated 23 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 5 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-23
460 strcmp(hdr->value, "application/pkcs7-mime")) {
never executed: __result = (((const unsigned char *) (const char *) ( hdr->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "application/pkcs7-mime" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ...mime" )))); })Description
TRUEnever evaluated
FALSEevaluated 23 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-23
461 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_INVALID_MIME_TYPE);-
462 ERR_add_error_data(2, "type: ", hdr->value);-
463 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
464 return NULL;
never executed: return ((void *)0) ;
0
465 }-
466-
467 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
468-
469 if ((val = b64_read_asn1(bio, it)) == NULL) {
(val = b64_rea...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 28 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-28
470 ASN1err(ASN1_F_SMIME_READ_ASN1, ASN1_R_ASN1_PARSE_ERROR);-
471 return NULL;
never executed: return ((void *)0) ;
0
472 }-
473 return val;
executed 28 times by 1 test: return val;
Executed by:
  • libcrypto.so.1.1
28
474-
475}-
476-
477/* Copy text from one BIO to another making the output CRLF at EOL */-
478int SMIME_crlf_copy(BIO *in, BIO *out, int flags)-
479{-
480 BIO *bf;-
481 char eol;-
482 int len;-
483 char linebuf[MAX_SMLEN];-
484 /*-
485 * Buffer output so we don't write one line at a time. This is useful-
486 * when streaming as we don't end up with one OCTET STRING per line.-
487 */-
488 bf = BIO_new(BIO_f_buffer());-
489 if (bf == NULL)
bf == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 79 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-79
490 return 0;
never executed: return 0;
0
491 out = BIO_push(bf, out);-
492 if (flags & SMIME_BINARY) {
flags & 0x80Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 78 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-78
493 while ((len = BIO_read(in, linebuf, MAX_SMLEN)) > 0)
(len = BIO_rea...uf, 1024)) > 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
1
494 BIO_write(out, linebuf, len);
executed 1 time by 1 test: BIO_write(out, linebuf, len);
Executed by:
  • libcrypto.so.1.1
1
495 } else {
executed 1 time by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
1
496 int eolcnt = 0;-
497 if (flags & SMIME_TEXT)
flags & 0x1Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 77 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
1-77
498 BIO_printf(out, "Content-Type: text/plain\r\n\r\n");
executed 1 time by 1 test: BIO_printf(out, "Content-Type: text/plain\r\n\r\n");
Executed by:
  • libcrypto.so.1.1
1
499 while ((len = BIO_gets(in, linebuf, MAX_SMLEN)) > 0) {
(len = BIO_get...uf, 1024)) > 0Description
TRUEevaluated 78 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 78 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
78
500 eol = strip_eol(linebuf, &len, flags);-
501 if (len) {
lenDescription
TRUEevaluated 78 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-78
502 /* Not EOF: write out all CRLF */-
503 if (flags & SMIME_ASCIICRLF) {
flags & 0x80000Description
TRUEnever evaluated
FALSEevaluated 78 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-78
504 int i;-
505 for (i = 0; i < eolcnt; i++)
i < eolcntDescription
TRUEnever evaluated
FALSEnever evaluated
0
506 BIO_write(out, "\r\n", 2);
never executed: BIO_write(out, "\r\n", 2);
0
507 eolcnt = 0;-
508 }
never executed: end of block
0
509 BIO_write(out, linebuf, len);-
510 if (eol)
eolDescription
TRUEnever evaluated
FALSEevaluated 78 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-78
511 BIO_write(out, "\r\n", 2);
never executed: BIO_write(out, "\r\n", 2);
0
512 } else if (flags & SMIME_ASCIICRLF)
executed 78 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
flags & 0x80000Description
TRUEnever evaluated
FALSEnever evaluated
0-78
513 eolcnt++;
never executed: eolcnt++;
0
514 else if (eol)
eolDescription
TRUEnever evaluated
FALSEnever evaluated
0
515 BIO_write(out, "\r\n", 2);
never executed: BIO_write(out, "\r\n", 2);
0
516 }
executed 78 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
78
517 }
executed 78 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
78
518 (void)BIO_flush(out);-
519 BIO_pop(out);-
520 BIO_free(bf);-
521 return 1;
executed 79 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
79
522}-
523-
524/* Strip off headers if they are text/plain */-
525int SMIME_text(BIO *in, BIO *out)-
526{-
527 char iobuf[4096];-
528 int len;-
529 STACK_OF(MIME_HEADER) *headers;-
530 MIME_HEADER *hdr;-
531-
532 if ((headers = mime_parse_hdr(in)) == NULL) {
(headers = mim...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
533 ASN1err(ASN1_F_SMIME_TEXT, ASN1_R_MIME_PARSE_ERROR);-
534 return 0;
never executed: return 0;
0
535 }-
536 if ((hdr = mime_hdr_find(headers, "content-type")) == NULL
(hdr = mime_hd...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
537 || hdr->value == NULL) {
hdr->value == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
538 ASN1err(ASN1_F_SMIME_TEXT, ASN1_R_MIME_NO_CONTENT_TYPE);-
539 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
540 return 0;
never executed: return 0;
0
541 }-
542 if (strcmp(hdr->value, "text/plain")) {
never executed: __result = (((const unsigned char *) (const char *) ( hdr->value ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "text/plain" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ...lain" )))); })Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-1
543 ASN1err(ASN1_F_SMIME_TEXT, ASN1_R_INVALID_MIME_TYPE);-
544 ERR_add_error_data(2, "type: ", hdr->value);-
545 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
546 return 0;
never executed: return 0;
0
547 }-
548 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
549 while ((len = BIO_read(in, iobuf, sizeof(iobuf))) > 0)
(len = BIO_rea...f(iobuf))) > 0Description
TRUEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
1
550 BIO_write(out, iobuf, len);
executed 1 time by 1 test: BIO_write(out, iobuf, len);
Executed by:
  • libcrypto.so.1.1
1
551 if (len < 0)
len < 0Description
TRUEnever evaluated
FALSEevaluated 1 time by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1
552 return 0;
never executed: return 0;
0
553 return 1;
executed 1 time by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
1
554}-
555-
556/*-
557 * Split a multipart/XXX message body into component parts: result is-
558 * canonical parts in a STACK of bios-
559 */-
560-
561static int multi_split(BIO *bio, const char *bound, STACK_OF(BIO) **ret)-
562{-
563 char linebuf[MAX_SMLEN];-
564 int len, blen;-
565 int eol = 0, next_eol = 0;-
566 BIO *bpart = NULL;-
567 STACK_OF(BIO) *parts;-
568 char state, part, first;-
569-
570 blen = strlen(bound);-
571 part = 0;-
572 state = 0;-
573 first = 1;-
574 parts = sk_BIO_new_null();-
575 *ret = parts;-
576 if (*ret == NULL)
*ret == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
577 return 0;
never executed: return 0;
0
578 while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) {
(len = BIO_get...uf, 1024)) > 0Description
TRUEevaluated 642 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-642
579 state = mime_bound_check(linebuf, len, bound, blen);-
580 if (state == 1) {
state == 1Description
TRUEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 630 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
12-630
581 first = 1;-
582 part++;-
583 } else if (state == 2) {
executed 12 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
state == 2Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 624 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
6-624
584 if (!sk_BIO_push(parts, bpart)) {
!sk_BIO_push(parts, bpart)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
585 BIO_free(bpart);-
586 return 0;
never executed: return 0;
0
587 }-
588 return 1;
executed 6 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
6
589 } else if (part) {
partDescription
TRUEevaluated 612 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
12-612
590 /* Strip CR+LF from linebuf */-
591 next_eol = strip_eol(linebuf, &len, 0);-
592 if (first) {
firstDescription
TRUEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 600 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
12-600
593 first = 0;-
594 if (bpart)
bpartDescription
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
6
595 if (!sk_BIO_push(parts, bpart)) {
!sk_BIO_push(parts, bpart)Description
TRUEnever evaluated
FALSEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-6
596 BIO_free(bpart);-
597 return 0;
never executed: return 0;
0
598 }-
599 bpart = BIO_new(BIO_s_mem());-
600 if (bpart == NULL)
bpart == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-12
601 return 0;
never executed: return 0;
0
602 BIO_set_mem_eof_return(bpart, 0);-
603 } else if (eol)
executed 12 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
eolDescription
TRUEevaluated 600 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-600
604 BIO_write(bpart, "\r\n", 2);
executed 600 times by 1 test: BIO_write(bpart, "\r\n", 2);
Executed by:
  • libcrypto.so.1.1
600
605 eol = next_eol;-
606 if (len)
lenDescription
TRUEevaluated 600 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
12-600
607 BIO_write(bpart, linebuf, len);
executed 600 times by 1 test: BIO_write(bpart, linebuf, len);
Executed by:
  • libcrypto.so.1.1
600
608 }
executed 612 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
612
609 }
executed 636 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
636
610 BIO_free(bpart);-
611 return 0;
never executed: return 0;
0
612}-
613-
614/* This is the big one: parse MIME header lines up to message body */-
615-
616#define MIME_INVALID 0-
617#define MIME_START 1-
618#define MIME_TYPE 2-
619#define MIME_NAME 3-
620#define MIME_VALUE 4-
621#define MIME_QUOTE 5-
622#define MIME_COMMENT 6-
623-
624static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio)-
625{-
626 char *p, *q, c;-
627 char *ntmp;-
628 char linebuf[MAX_SMLEN];-
629 MIME_HEADER *mhdr = NULL, *new_hdr = NULL;-
630 STACK_OF(MIME_HEADER) *headers;-
631 int len, state, save_state = 0;-
632-
633 headers = sk_MIME_HEADER_new(mime_hdr_cmp);-
634 if (headers == NULL)
headers == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 41 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-41
635 return NULL;
never executed: return ((void *)0) ;
0
636 while ((len = BIO_gets(bio, linebuf, MAX_SMLEN)) > 0) {
(len = BIO_get...uf, 1024)) > 0Description
TRUEevaluated 184 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-184
637 /* If whitespace at line start then continuation line */-
638 if (mhdr && ossl_isspace(linebuf[0]))
mhdrDescription
TRUEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 41 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(ossl_ctype_ch...buf[0]), 0x8))Description
TRUEevaluated 41 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 102 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
41-143
639 state = MIME_NAME;
executed 41 times by 1 test: state = 3;
Executed by:
  • libcrypto.so.1.1
41
640 else-
641 state = MIME_START;
executed 143 times by 1 test: state = 1;
Executed by:
  • libcrypto.so.1.1
143
642 ntmp = NULL;-
643 /* Go through all characters */-
644 for (p = linebuf, q = linebuf; (c = *p) && (c != '\r') && (c != '\n');
(c = *p)Description
TRUEevaluated 7145 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
(c != '\r')Description
TRUEevaluated 7119 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 26 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
(c != '\n')Description
TRUEevaluated 6961 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 158 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-7145
645 p++) {-
646-
647 /*-
648 * State machine to handle MIME headers if this looks horrible-
649 * that's because it *is*-
650 */-
651-
652 switch (state) {-
653 case MIME_START:
executed 2539 times by 1 test: case 1:
Executed by:
  • libcrypto.so.1.1
2539
654 if (c == ':') {
c == ':'Description
TRUEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 2396 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
143-2396
655 state = MIME_TYPE;-
656 *p = 0;-
657 ntmp = strip_ends(q);-
658 q = p + 1;-
659 }
executed 143 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
143
660 break;
executed 2539 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
2539
661-
662 case MIME_TYPE:
executed 1761 times by 1 test: case 2:
Executed by:
  • libcrypto.so.1.1
1761
663 if (c == ';') {
c == ';'Description
TRUEevaluated 74 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1687 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
74-1687
664 mime_debug("Found End Value\n");-
665 *p = 0;-
666 new_hdr = mime_hdr_new(ntmp, strip_ends(q));-
667 if (new_hdr == NULL)
new_hdr == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 74 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-74
668 goto err;
never executed: goto err;
0
669 if (!sk_MIME_HEADER_push(headers, new_hdr))
!sk_MIME_HEADE...ders, new_hdr)Description
TRUEnever evaluated
FALSEevaluated 74 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-74
670 goto err;
never executed: goto err;
0
671 mhdr = new_hdr;-
672 new_hdr = NULL;-
673 ntmp = NULL;-
674 q = p + 1;-
675 state = MIME_NAME;-
676 } else if (c == '(') {
executed 74 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
c == '('Description
TRUEnever evaluated
FALSEevaluated 1687 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-1687
677 save_state = state;-
678 state = MIME_COMMENT;-
679 }
never executed: end of block
0
680 break;
executed 1761 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1761
681-
682 case MIME_COMMENT:
never executed: case 6:
0
683 if (c == ')') {
c == ')'Description
TRUEnever evaluated
FALSEnever evaluated
0
684 state = save_state;-
685 }
never executed: end of block
0
686 break;
never executed: break;
0
687-
688 case MIME_NAME:
executed 1048 times by 1 test: case 3:
Executed by:
  • libcrypto.so.1.1
1048
689 if (c == '=') {
c == '='Description
TRUEevaluated 114 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 934 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
114-934
690 state = MIME_VALUE;-
691 *p = 0;-
692 ntmp = strip_ends(q);-
693 q = p + 1;-
694 }
executed 114 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
114
695 break;
executed 1048 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1048
696-
697 case MIME_VALUE:
executed 500 times by 1 test: case 4:
Executed by:
  • libcrypto.so.1.1
500
698 if (c == ';') {
c == ';'Description
TRUEevaluated 40 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 460 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
40-460
699 state = MIME_NAME;-
700 *p = 0;-
701 mime_hdr_addparam(mhdr, ntmp, strip_ends(q));-
702 ntmp = NULL;-
703 q = p + 1;-
704 } else if (c == '"') {
executed 40 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
c == '"'Description
TRUEevaluated 86 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 374 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
40-374
705 mime_debug("Found Quote\n");-
706 state = MIME_QUOTE;-
707 } else if (c == '(') {
executed 86 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
c == '('Description
TRUEnever evaluated
FALSEevaluated 374 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-374
708 save_state = state;-
709 state = MIME_COMMENT;-
710 }
never executed: end of block
0
711 break;
executed 500 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
500
712-
713 case MIME_QUOTE:
executed 1113 times by 1 test: case 5:
Executed by:
  • libcrypto.so.1.1
1113
714 if (c == '"') {
c == '"'Description
TRUEevaluated 86 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 1027 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
86-1027
715 mime_debug("Found Match Quote\n");-
716 state = MIME_VALUE;-
717 }
executed 86 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
86
718 break;
executed 1113 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
1113
719 }-
720 }
executed 6961 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
6961
721-
722 if (state == MIME_TYPE) {
state == 2Description
TRUEevaluated 69 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 115 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
69-115
723 new_hdr = mime_hdr_new(ntmp, strip_ends(q));-
724 if (new_hdr == NULL)
new_hdr == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 69 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-69
725 goto err;
never executed: goto err;
0
726 if (!sk_MIME_HEADER_push(headers, new_hdr))
!sk_MIME_HEADE...ders, new_hdr)Description
TRUEnever evaluated
FALSEevaluated 69 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-69
727 goto err;
never executed: goto err;
0
728 mhdr = new_hdr;-
729 new_hdr = NULL;-
730 } else if (state == MIME_VALUE)
executed 69 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
state == 4Description
TRUEevaluated 74 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 41 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
41-74
731 mime_hdr_addparam(mhdr, ntmp, strip_ends(q));
executed 74 times by 1 test: mime_hdr_addparam(mhdr, ntmp, strip_ends(q));
Executed by:
  • libcrypto.so.1.1
74
732 if (p == linebuf)
p == linebufDescription
TRUEevaluated 41 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
41-143
733 break; /* Blank line means end of headers */
executed 41 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
41
734 }
executed 143 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
143
735-
736 return headers;
executed 41 times by 1 test: return headers;
Executed by:
  • libcrypto.so.1.1
41
737-
738err:-
739 mime_hdr_free(new_hdr);-
740 sk_MIME_HEADER_pop_free(headers, mime_hdr_free);-
741 return NULL;
never executed: return ((void *)0) ;
0
742}-
743-
744static char *strip_ends(char *name)-
745{-
746 return strip_end(strip_start(name));
executed 514 times by 1 test: return strip_end(strip_start(name));
Executed by:
  • libcrypto.so.1.1
514
747}-
748-
749/* Strip a parameter of whitespace from start of param */-
750static char *strip_start(char *name)-
751{-
752 char *p, c;-
753 /* Look for first non white space or quote */-
754 for (p = name; (c = *p); p++) {
(c = *p)Description
TRUEevaluated 771 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-771
755 if (c == '"') {
c == '"'Description
TRUEevaluated 86 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 685 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
86-685
756 /* Next char is start of string if non null */-
757 if (p[1])
p[1]Description
TRUEevaluated 86 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-86
758 return p + 1;
executed 86 times by 1 test: return p + 1;
Executed by:
  • libcrypto.so.1.1
86
759 /* Else null string */-
760 return NULL;
never executed: return ((void *)0) ;
0
761 }-
762 if (!ossl_isspace(c))
!(ossl_ctype_check((c), 0x8))Description
TRUEevaluated 428 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 257 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
257-428
763 return p;
executed 428 times by 1 test: return p;
Executed by:
  • libcrypto.so.1.1
428
764 }
executed 257 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
257
765 return NULL;
never executed: return ((void *)0) ;
0
766}-
767-
768/* As above but strip from end of string : maybe should handle brackets? */-
769static char *strip_end(char *name)-
770{-
771 char *p, c;-
772 if (!name)
!nameDescription
TRUEnever evaluated
FALSEevaluated 514 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-514
773 return NULL;
never executed: return ((void *)0) ;
0
774 /* Look for first non white space or quote */-
775 for (p = name + strlen(name) - 1; p >= name; p--) {
p >= nameDescription
TRUEevaluated 676 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-676
776 c = *p;-
777 if (c == '"') {
c == '"'Description
TRUEevaluated 86 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 590 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
86-590
778 if (p - 1 == name)
p - 1 == nameDescription
TRUEnever evaluated
FALSEevaluated 86 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-86
779 return NULL;
never executed: return ((void *)0) ;
0
780 *p = 0;-
781 return name;
executed 86 times by 1 test: return name;
Executed by:
  • libcrypto.so.1.1
86
782 }-
783 if (ossl_isspace(c))
(ossl_ctype_check((c), 0x8))Description
TRUEevaluated 162 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 428 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
162-428
784 *p = 0;
executed 162 times by 1 test: *p = 0;
Executed by:
  • libcrypto.so.1.1
162
785 else-
786 return name;
executed 428 times by 1 test: return name;
Executed by:
  • libcrypto.so.1.1
428
787 }-
788 return NULL;
never executed: return ((void *)0) ;
0
789}-
790-
791static MIME_HEADER *mime_hdr_new(const char *name, const char *value)-
792{-
793 MIME_HEADER *mhdr = NULL;-
794 char *tmpname = NULL, *tmpval = NULL, *p;-
795-
796 if (name) {
nameDescription
TRUEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-143
797 if ((tmpname = OPENSSL_strdup(name)) == NULL)
(tmpname = CRY...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-143
798 return NULL;
never executed: return ((void *)0) ;
0
799 for (p = tmpname; *p; p++)
*pDescription
TRUEevaluated 2396 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
143-2396
800 *p = ossl_tolower(*p);
executed 2396 times by 1 test: *p = ossl_tolower(*p);
Executed by:
  • libcrypto.so.1.1
2396
801 }
executed 143 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
143
802 if (value) {
valueDescription
TRUEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-143
803 if ((tmpval = OPENSSL_strdup(value)) == NULL)
(tmpval = CRYP...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-143
804 goto err;
never executed: goto err;
0
805 for (p = tmpval; *p; p++)
*pDescription
TRUEevaluated 1544 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
143-1544
806 *p = ossl_tolower(*p);
executed 1544 times by 1 test: *p = ossl_tolower(*p);
Executed by:
  • libcrypto.so.1.1
1544
807 }
executed 143 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
143
808 mhdr = OPENSSL_malloc(sizeof(*mhdr));-
809 if (mhdr == NULL)
mhdr == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-143
810 goto err;
never executed: goto err;
0
811 mhdr->name = tmpname;-
812 mhdr->value = tmpval;-
813 if ((mhdr->params = sk_MIME_PARAM_new(mime_param_cmp)) == NULL)
(mhdr->params ...== ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-143
814 goto err;
never executed: goto err;
0
815 return mhdr;
executed 143 times by 1 test: return mhdr;
Executed by:
  • libcrypto.so.1.1
143
816-
817 err:-
818 OPENSSL_free(tmpname);-
819 OPENSSL_free(tmpval);-
820 OPENSSL_free(mhdr);-
821 return NULL;
never executed: return ((void *)0) ;
0
822}-
823-
824static int mime_hdr_addparam(MIME_HEADER *mhdr, const char *name, const char *value)-
825{-
826 char *tmpname = NULL, *tmpval = NULL, *p;-
827 MIME_PARAM *mparam = NULL;-
828-
829 if (name) {
nameDescription
TRUEevaluated 114 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-114
830 tmpname = OPENSSL_strdup(name);-
831 if (!tmpname)
!tmpnameDescription
TRUEnever evaluated
FALSEevaluated 114 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-114
832 goto err;
never executed: goto err;
0
833 for (p = tmpname; *p; p++)
*pDescription
TRUEevaluated 820 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 114 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
114-820
834 *p = ossl_tolower(*p);
executed 820 times by 1 test: *p = ossl_tolower(*p);
Executed by:
  • libcrypto.so.1.1
820
835 }
executed 114 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
114
836 if (value) {
valueDescription
TRUEevaluated 114 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-114
837 tmpval = OPENSSL_strdup(value);-
838 if (!tmpval)
!tmpvalDescription
TRUEnever evaluated
FALSEevaluated 114 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-114
839 goto err;
never executed: goto err;
0
840 }
executed 114 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
114
841 /* Parameter values are case sensitive so leave as is */-
842 mparam = OPENSSL_malloc(sizeof(*mparam));-
843 if (mparam == NULL)
mparam == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 114 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-114
844 goto err;
never executed: goto err;
0
845 mparam->param_name = tmpname;-
846 mparam->param_value = tmpval;-
847 if (!sk_MIME_PARAM_push(mhdr->params, mparam))
!sk_MIME_PARAM...arams, mparam)Description
TRUEnever evaluated
FALSEevaluated 114 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-114
848 goto err;
never executed: goto err;
0
849 return 1;
executed 114 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
114
850 err:-
851 OPENSSL_free(tmpname);-
852 OPENSSL_free(tmpval);-
853 OPENSSL_free(mparam);-
854 return 0;
never executed: return 0;
0
855}-
856-
857static int mime_hdr_cmp(const MIME_HEADER *const *a,-
858 const MIME_HEADER *const *b)-
859{-
860 if (!(*a)->name || !(*b)->name)
!(*a)->nameDescription
TRUEnever evaluated
FALSEevaluated 251 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
!(*b)->nameDescription
TRUEnever evaluated
FALSEevaluated 251 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-251
861 return ! !(*a)->name - ! !(*b)->name;
never executed: return ! !(*a)->name - ! !(*b)->name;
0
862-
863 return strcmp((*a)->name, (*b)->name);
executed 251 times by 1 test: return __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ( (*a)->name ) && __builtin_constant_p ( (*b)->name ) && (__s1_len = __builtin_strlen ( (*a)->name ), __s2_len = __builtin_strlen ( (*b)->name ), (!((size_t)(const void *)(( (*a)->na...unsigned char *) (const char *) ( (*b)->name ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ( (*b)->name ))[3] - __s2[3]); } } __result; }))) : __builtin_strcmp ( (*a)->name , (*b)->name )))); }) ;
Executed by:
  • libcrypto.so.1.1
never executed: __result = (((const unsigned char *) (const char *) ( (*a)->name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( (*b)->name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-251
864}-
865-
866static int mime_param_cmp(const MIME_PARAM *const *a,-
867 const MIME_PARAM *const *b)-
868{-
869 if (!(*a)->param_name || !(*b)->param_name)
!(*a)->param_nameDescription
TRUEnever evaluated
FALSEevaluated 30 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
!(*b)->param_nameDescription
TRUEnever evaluated
FALSEevaluated 30 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-30
870 return ! !(*a)->param_name - ! !(*b)->param_name;
never executed: return ! !(*a)->param_name - ! !(*b)->param_name;
0
871 return strcmp((*a)->param_name, (*b)->param_name);
executed 30 times by 1 test: return __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p ( (*a)->param_name ) && __builtin_constant_p ( (*b)->param_name ) && (__s1_len = __builtin_strlen ( (*a)->param_name ), __s2_len = __builtin_strlen ( (*b)->param_name ), (!((size_t)(...char *) ( (*b)->param_name ))[2] - __s2[2]); if (__s2_len > 2 && __result == 0) __result = (((const unsigned char *) (const char *) ( (*b)->param_name ))[3] - __s2[3]); } } __result; }))) : __builtin_strcmp ( (*a)->param_name , (*b)->param_name )))); }) ;
Executed by:
  • libcrypto.so.1.1
never executed: __result = (((const unsigned char *) (const char *) ( (*a)->param_name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( (*b)->param_name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-30
872}-
873-
874/* Find a header with a given name (if possible) */-
875-
876static MIME_HEADER *mime_hdr_find(STACK_OF(MIME_HEADER) *hdrs, const char *name)-
877{-
878 MIME_HEADER htmp;-
879 int idx;-
880-
881 htmp.name = (char *)name;-
882 htmp.value = NULL;-
883 htmp.params = NULL;-
884-
885 idx = sk_MIME_HEADER_find(hdrs, &htmp);-
886 return sk_MIME_HEADER_value(hdrs, idx);
executed 41 times by 1 test: return sk_MIME_HEADER_value(hdrs, idx);
Executed by:
  • libcrypto.so.1.1
41
887}-
888-
889static MIME_PARAM *mime_param_find(MIME_HEADER *hdr, const char *name)-
890{-
891 MIME_PARAM param;-
892 int idx;-
893-
894 param.param_name = (char *)name;-
895 param.param_value = NULL;-
896 idx = sk_MIME_PARAM_find(hdr->params, &param);-
897 return sk_MIME_PARAM_value(hdr->params, idx);
executed 6 times by 1 test: return sk_MIME_PARAM_value(hdr->params, idx);
Executed by:
  • libcrypto.so.1.1
6
898}-
899-
900static void mime_hdr_free(MIME_HEADER *hdr)-
901{-
902 if (hdr == NULL)
hdr == ((void *)0)Description
TRUEnever evaluated
FALSEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-143
903 return;
never executed: return;
0
904 OPENSSL_free(hdr->name);-
905 OPENSSL_free(hdr->value);-
906 if (hdr->params)
hdr->paramsDescription
TRUEevaluated 143 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-143
907 sk_MIME_PARAM_pop_free(hdr->params, mime_param_free);
executed 143 times by 1 test: sk_MIME_PARAM_pop_free(hdr->params, mime_param_free);
Executed by:
  • libcrypto.so.1.1
143
908 OPENSSL_free(hdr);-
909}
executed 143 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
143
910-
911static void mime_param_free(MIME_PARAM *param)-
912{-
913 OPENSSL_free(param->param_name);-
914 OPENSSL_free(param->param_value);-
915 OPENSSL_free(param);-
916}
executed 114 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
114
917-
918/*--
919 * Check for a multipart boundary. Returns:-
920 * 0 : no boundary-
921 * 1 : part boundary-
922 * 2 : final boundary-
923 */-
924static int mime_bound_check(char *line, int linelen, const char *bound, int blen)-
925{-
926 if (linelen == -1)
linelen == -1Description
TRUEnever evaluated
FALSEevaluated 642 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-642
927 linelen = strlen(line);
never executed: linelen = strlen(line);
0
928 if (blen == -1)
blen == -1Description
TRUEnever evaluated
FALSEevaluated 642 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
0-642
929 blen = strlen(bound);
never executed: blen = strlen(bound);
0
930 /* Quickly eliminate if line length too short */-
931 if (blen + 2 > linelen)
blen + 2 > linelenDescription
TRUEevaluated 36 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 606 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
36-606
932 return 0;
executed 36 times by 1 test: return 0;
Executed by:
  • libcrypto.so.1.1
36
933 /* Check for part boundary */-
934 if ((strncmp(line, "--", 2) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( line ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "--" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
( (__extension... , 2 ))) == 0)Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 588 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__builtin_constant_p ( 2 )Description
TRUEevaluated 606 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
__builtin_constant_p ( line )Description
TRUEnever evaluated
FALSEevaluated 606 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
strlen ( line ...size_t) ( 2 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( "--" )Description
TRUEevaluated 606 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
strlen ( "--" ...size_t) ( 2 ))Description
TRUEnever evaluated
FALSEevaluated 606 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-606
935 && strncmp(line + 2, bound, blen) == 0) {
never executed: __result = (((const unsigned char *) (const char *) ( line + 2 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( bound ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__... blen ))) == 0Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
__builtin_constant_p ( blen )Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__builtin_cons...p ( line + 2 )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( line ...e_t) ( blen ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( bound )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( bound...e_t) ( blen ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-18
936 if (strncmp(line + blen + 2, "--", 2) == 0)
never executed: __result = (((const unsigned char *) (const char *) ( line + blen + 2 ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "--" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__..." , 2 ))) == 0Description
TRUEevaluated 6 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__builtin_constant_p ( 2 )Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
__builtin_cons...e + blen + 2 )Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
strlen ( line ...size_t) ( 2 ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( "--" )Description
TRUEevaluated 18 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
strlen ( "--" ...size_t) ( 2 ))Description
TRUEnever evaluated
FALSEevaluated 18 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0-18
937 return 2;
executed 6 times by 1 test: return 2;
Executed by:
  • libcrypto.so.1.1
6
938 else-
939 return 1;
executed 12 times by 1 test: return 1;
Executed by:
  • libcrypto.so.1.1
12
940 }-
941 return 0;
executed 588 times by 1 test: return 0;
Executed by:
  • libcrypto.so.1.1
588
942}-
943-
944static int strip_eol(char *linebuf, int *plen, int flags)-
945{-
946 int len = *plen;-
947 char *p, c;-
948 int is_eol = 0;-
949-
950 for (p = linebuf + len - 1; len > 0; len--, p--) {
len > 0Description
TRUEevaluated 1290 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 12 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
12-1290
951 c = *p;-
952 if (c == '\n') {
c == '\n'Description
TRUEevaluated 612 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 678 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
612-678
953 is_eol = 1;-
954 } else if (is_eol && flags & SMIME_ASCIICRLF && c == 32) {
executed 612 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
is_eolDescription
TRUEevaluated 600 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEevaluated 78 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
flags & 0x80000Description
TRUEnever evaluated
FALSEevaluated 600 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
c == 32Description
TRUEnever evaluated
FALSEnever evaluated
0-612
955 /* Strip trailing space on a line; 32 == ASCII for ' ' */-
956 continue;
never executed: continue;
0
957 } else if (c != '\r') {
c != '\r'Description
TRUEevaluated 678 times by 1 test
Evaluated by:
  • libcrypto.so.1.1
FALSEnever evaluated
0-678
958 break;
executed 678 times by 1 test: break;
Executed by:
  • libcrypto.so.1.1
678
959 }-
960 }
executed 612 times by 1 test: end of block
Executed by:
  • libcrypto.so.1.1
612
961 *plen = len;-
962 return is_eol;
executed 690 times by 1 test: return is_eol;
Executed by:
  • libcrypto.so.1.1
690
963}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2