OpenCoverage

a_d2i_fp.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/asn1/a_d2i_fp.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: a_d2i_fp.c,v 1.16 2017/01/29 17:49:22 beck 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 <limits.h>-
60#include <stdio.h>-
61-
62#include <openssl/asn1.h>-
63#include <openssl/buffer.h>-
64#include <openssl/err.h>-
65-
66static int asn1_d2i_read_bio(BIO *in, BUF_MEM **pb);-
67-
68#ifndef NO_OLD_ASN1-
69-
70void *-
71ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x)-
72{-
73 BIO *b;-
74 void *ret;-
75-
76 if ((b = BIO_new(BIO_s_file())) == NULL) {
(b = BIO_new(B...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
77 ASN1error(ERR_R_BUF_LIB);-
78 return (NULL);
never executed: return ( ((void *)0) );
0
79 }-
80 BIO_set_fp(b, in, BIO_NOCLOSE);-
81 ret = ASN1_d2i_bio(xnew, d2i, b, x);-
82 BIO_free(b);-
83 return (ret);
never executed: return (ret);
0
84}-
85-
86void *-
87ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x)-
88{-
89 BUF_MEM *b = NULL;-
90 const unsigned char *p;-
91 void *ret = NULL;-
92 int len;-
93-
94 len = asn1_d2i_read_bio(in, &b);-
95 if (len < 0)
len < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
96 goto err;
never executed: goto err;
0
97-
98 p = (unsigned char *)b->data;-
99 ret = d2i(x, &p, len);-
100-
101err:
code before this statement never executed: err:
0
102 if (b != NULL)
b != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
103 BUF_MEM_free(b);
never executed: BUF_MEM_free(b);
0
104 return (ret);
never executed: return (ret);
0
105}-
106-
107#endif-
108-
109void *-
110ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x)-
111{-
112 BUF_MEM *b = NULL;-
113 const unsigned char *p;-
114 void *ret = NULL;-
115 int len;-
116-
117 len = asn1_d2i_read_bio(in, &b);-
118 if (len < 0)
len < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
119 goto err;
never executed: goto err;
0
120-
121 p = (const unsigned char *)b->data;-
122 ret = ASN1_item_d2i(x, &p, len, it);-
123-
124err:
code before this statement never executed: err:
0
125 if (b != NULL)
b != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
126 BUF_MEM_free(b);
never executed: BUF_MEM_free(b);
0
127 return (ret);
never executed: return (ret);
0
128}-
129-
130void *-
131ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x)-
132{-
133 BIO *b;-
134 char *ret;-
135-
136 if ((b = BIO_new(BIO_s_file())) == NULL) {
(b = BIO_new(B...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
137 ASN1error(ERR_R_BUF_LIB);-
138 return (NULL);
never executed: return ( ((void *)0) );
0
139 }-
140 BIO_set_fp(b, in, BIO_NOCLOSE);-
141 ret = ASN1_item_d2i_bio(it, b, x);-
142 BIO_free(b);-
143 return (ret);
never executed: return (ret);
0
144}-
145-
146#define HEADER_SIZE 8-
147#define ASN1_CHUNK_INITIAL_SIZE (16 * 1024)-
148static int-
149asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)-
150{-
151 BUF_MEM *b;-
152 unsigned char *p;-
153 int i;-
154 ASN1_const_CTX c;-
155 size_t want = HEADER_SIZE;-
156 int eos = 0;-
157 size_t off = 0;-
158 size_t len = 0;-
159-
160 b = BUF_MEM_new();-
161 if (b == NULL) {
b == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
162 ASN1error(ERR_R_MALLOC_FAILURE);-
163 return -1;
never executed: return -1;
0
164 }-
165-
166 ERR_clear_error();-
167 for (;;) {-
168 if (want >= (len - off)) {
want >= (len - off)Description
TRUEnever evaluated
FALSEnever evaluated
0
169 want -= (len - off);-
170-
171 if (len + want < len ||
len + want < lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
172 !BUF_MEM_grow_clean(b, len + want)) {
!BUF_MEM_grow_...b, len + want)Description
TRUEnever evaluated
FALSEnever evaluated
0
173 ASN1error(ERR_R_MALLOC_FAILURE);-
174 goto err;
never executed: goto err;
0
175 }-
176 i = BIO_read(in, &(b->data[len]), want);-
177 if ((i < 0) && ((len - off) == 0)) {
(i < 0)Description
TRUEnever evaluated
FALSEnever evaluated
((len - off) == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
178 ASN1error(ASN1_R_NOT_ENOUGH_DATA);-
179 goto err;
never executed: goto err;
0
180 }-
181 if (i > 0) {
i > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
182 if (len + i < len) {
len + i < lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
183 ASN1error(ASN1_R_TOO_LONG);-
184 goto err;
never executed: goto err;
0
185 }-
186 len += i;-
187 }
never executed: end of block
0
188 }
never executed: end of block
0
189 /* else data already loaded */-
190-
191 p = (unsigned char *) & (b->data[off]);-
192 c.p = p;-
193 c.inf = ASN1_get_object(&(c.p), &(c.slen), &(c.tag),-
194 &(c.xclass), len - off);-
195 if (c.inf & 0x80) {
c.inf & 0x80Description
TRUEnever evaluated
FALSEnever evaluated
0
196 unsigned long e;-
197-
198 e = ERR_GET_REASON(ERR_peek_error());-
199 if (e != ASN1_R_TOO_LONG)
e != 155Description
TRUEnever evaluated
FALSEnever evaluated
0
200 goto err;
never executed: goto err;
0
201 else-
202 ERR_clear_error(); /* clear error */
never executed: ERR_clear_error();
0
203 }-
204 i = c.p - p; /* header length */-
205 off += i; /* end of data */-
206-
207 if (c.inf & 1) {
c.inf & 1Description
TRUEnever evaluated
FALSEnever evaluated
0
208 /* no data body so go round again */-
209 eos++;-
210 if (eos < 0) {
eos < 0Description
TRUEnever evaluated
FALSEnever evaluated
0
211 ASN1error(ASN1_R_HEADER_TOO_LONG);-
212 goto err;
never executed: goto err;
0
213 }-
214 want = HEADER_SIZE;-
215 } else if (eos && (c.slen == 0) && (c.tag == V_ASN1_EOC)) {
never executed: end of block
eosDescription
TRUEnever evaluated
FALSEnever evaluated
(c.slen == 0)Description
TRUEnever evaluated
FALSEnever evaluated
(c.tag == 0)Description
TRUEnever evaluated
FALSEnever evaluated
0
216 /* eos value, so go back and read another header */-
217 eos--;-
218 if (eos <= 0)
eos <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
219 break;
never executed: break;
0
220 else-
221 want = HEADER_SIZE;
never executed: want = 8;
0
222 } else {-
223 /* suck in c.slen bytes of data */-
224 want = c.slen;-
225 if (want > (len - off)) {
want > (len - off)Description
TRUEnever evaluated
FALSEnever evaluated
0
226 size_t chunk_max = ASN1_CHUNK_INITIAL_SIZE;-
227-
228 want -= (len - off);-
229 if (want > INT_MAX /* BIO_read takes an int length */ ||
want > 0x7fffffffDescription
TRUEnever evaluated
FALSEnever evaluated
0
230 len+want < len) {
len+want < lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
231 ASN1error(ASN1_R_TOO_LONG);-
232 goto err;
never executed: goto err;
0
233 }-
234 while (want > 0) {
want > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
235 /*-
236 * Read content in chunks of increasing size-
237 * so we can return an error for EOF without-
238 * having to allocate the entire content length-
239 * in one go.-
240 */-
241 size_t chunk = want > chunk_max ? chunk_max : want;
want > chunk_maxDescription
TRUEnever evaluated
FALSEnever evaluated
0
242-
243 if (!BUF_MEM_grow_clean(b, len + chunk)) {
!BUF_MEM_grow_..., len + chunk)Description
TRUEnever evaluated
FALSEnever evaluated
0
244 ASN1error(ERR_R_MALLOC_FAILURE);-
245 goto err;
never executed: goto err;
0
246 }-
247 want -= chunk;-
248 while (chunk > 0) {
chunk > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
249 i = BIO_read(in, &(b->data[len]), chunk);-
250 if (i <= 0) {
i <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
251 ASN1error(ASN1_R_NOT_ENOUGH_DATA);-
252 goto err;
never executed: goto err;
0
253 }-
254 /*-
255 * This can't overflow because |len+want|-
256 * didn't overflow.-
257 */-
258 len += i;-
259 chunk -= i;-
260 }
never executed: end of block
0
261 if (chunk_max < INT_MAX/2)
chunk_max < 0x7fffffff/2Description
TRUEnever evaluated
FALSEnever evaluated
0
262 chunk_max *= 2;
never executed: chunk_max *= 2;
0
263 }
never executed: end of block
0
264 }
never executed: end of block
0
265 if (off + c.slen < off) {
off + c.slen < offDescription
TRUEnever evaluated
FALSEnever evaluated
0
266 ASN1error(ASN1_R_TOO_LONG);-
267 goto err;
never executed: goto err;
0
268 }-
269 off += c.slen;-
270 if (eos <= 0) {
eos <= 0Description
TRUEnever evaluated
FALSEnever evaluated
0
271 break;
never executed: break;
0
272 } else-
273 want = HEADER_SIZE;
never executed: want = 8;
0
274 }-
275 }-
276-
277 if (off > INT_MAX) {
off > 0x7fffffffDescription
TRUEnever evaluated
FALSEnever evaluated
0
278 ASN1error(ASN1_R_TOO_LONG);-
279 goto err;
never executed: goto err;
0
280 }-
281-
282 *pb = b;-
283 return off;
never executed: return off;
0
284-
285err:-
286 if (b != NULL)
b != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
287 BUF_MEM_free(b);
never executed: BUF_MEM_free(b);
0
288 return -1;
never executed: return -1;
0
289}-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2