summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/asn1/a_d2i_fp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/asn1/a_d2i_fp.c')
-rw-r--r--src/lib/libcrypto/asn1/a_d2i_fp.c33
1 files changed, 13 insertions, 20 deletions
diff --git a/src/lib/libcrypto/asn1/a_d2i_fp.c b/src/lib/libcrypto/asn1/a_d2i_fp.c
index c00b304c61..390a1072d5 100644
--- a/src/lib/libcrypto/asn1/a_d2i_fp.c
+++ b/src/lib/libcrypto/asn1/a_d2i_fp.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: a_d2i_fp.c,v 1.15 2016/05/20 15:46:21 bcook Exp $ */ 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) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -74,7 +74,7 @@ ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x)
74 void *ret; 74 void *ret;
75 75
76 if ((b = BIO_new(BIO_s_file())) == NULL) { 76 if ((b = BIO_new(BIO_s_file())) == NULL) {
77 ASN1err(ASN1_F_ASN1_D2I_FP, ERR_R_BUF_LIB); 77 ASN1error(ERR_R_BUF_LIB);
78 return (NULL); 78 return (NULL);
79 } 79 }
80 BIO_set_fp(b, in, BIO_NOCLOSE); 80 BIO_set_fp(b, in, BIO_NOCLOSE);
@@ -134,7 +134,7 @@ ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x)
134 char *ret; 134 char *ret;
135 135
136 if ((b = BIO_new(BIO_s_file())) == NULL) { 136 if ((b = BIO_new(BIO_s_file())) == NULL) {
137 ASN1err(ASN1_F_ASN1_ITEM_D2I_FP, ERR_R_BUF_LIB); 137 ASN1error(ERR_R_BUF_LIB);
138 return (NULL); 138 return (NULL);
139 } 139 }
140 BIO_set_fp(b, in, BIO_NOCLOSE); 140 BIO_set_fp(b, in, BIO_NOCLOSE);
@@ -159,7 +159,7 @@ asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
159 159
160 b = BUF_MEM_new(); 160 b = BUF_MEM_new();
161 if (b == NULL) { 161 if (b == NULL) {
162 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ERR_R_MALLOC_FAILURE); 162 ASN1error(ERR_R_MALLOC_FAILURE);
163 return -1; 163 return -1;
164 } 164 }
165 165
@@ -170,20 +170,17 @@ asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
170 170
171 if (len + want < len || 171 if (len + want < len ||
172 !BUF_MEM_grow_clean(b, len + want)) { 172 !BUF_MEM_grow_clean(b, len + want)) {
173 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, 173 ASN1error(ERR_R_MALLOC_FAILURE);
174 ERR_R_MALLOC_FAILURE);
175 goto err; 174 goto err;
176 } 175 }
177 i = BIO_read(in, &(b->data[len]), want); 176 i = BIO_read(in, &(b->data[len]), want);
178 if ((i < 0) && ((len - off) == 0)) { 177 if ((i < 0) && ((len - off) == 0)) {
179 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, 178 ASN1error(ASN1_R_NOT_ENOUGH_DATA);
180 ASN1_R_NOT_ENOUGH_DATA);
181 goto err; 179 goto err;
182 } 180 }
183 if (i > 0) { 181 if (i > 0) {
184 if (len + i < len) { 182 if (len + i < len) {
185 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, 183 ASN1error(ASN1_R_TOO_LONG);
186 ASN1_R_TOO_LONG);
187 goto err; 184 goto err;
188 } 185 }
189 len += i; 186 len += i;
@@ -211,8 +208,7 @@ asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
211 /* no data body so go round again */ 208 /* no data body so go round again */
212 eos++; 209 eos++;
213 if (eos < 0) { 210 if (eos < 0) {
214 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, 211 ASN1error(ASN1_R_HEADER_TOO_LONG);
215 ASN1_R_HEADER_TOO_LONG);
216 goto err; 212 goto err;
217 } 213 }
218 want = HEADER_SIZE; 214 want = HEADER_SIZE;
@@ -232,8 +228,7 @@ asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
232 want -= (len - off); 228 want -= (len - off);
233 if (want > INT_MAX /* BIO_read takes an int length */ || 229 if (want > INT_MAX /* BIO_read takes an int length */ ||
234 len+want < len) { 230 len+want < len) {
235 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, 231 ASN1error(ASN1_R_TOO_LONG);
236 ASN1_R_TOO_LONG);
237 goto err; 232 goto err;
238 } 233 }
239 while (want > 0) { 234 while (want > 0) {
@@ -246,16 +241,14 @@ asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
246 size_t chunk = want > chunk_max ? chunk_max : want; 241 size_t chunk = want > chunk_max ? chunk_max : want;
247 242
248 if (!BUF_MEM_grow_clean(b, len + chunk)) { 243 if (!BUF_MEM_grow_clean(b, len + chunk)) {
249 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, 244 ASN1error(ERR_R_MALLOC_FAILURE);
250 ERR_R_MALLOC_FAILURE);
251 goto err; 245 goto err;
252 } 246 }
253 want -= chunk; 247 want -= chunk;
254 while (chunk > 0) { 248 while (chunk > 0) {
255 i = BIO_read(in, &(b->data[len]), chunk); 249 i = BIO_read(in, &(b->data[len]), chunk);
256 if (i <= 0) { 250 if (i <= 0) {
257 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, 251 ASN1error(ASN1_R_NOT_ENOUGH_DATA);
258 ASN1_R_NOT_ENOUGH_DATA);
259 goto err; 252 goto err;
260 } 253 }
261 /* 254 /*
@@ -270,7 +263,7 @@ asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
270 } 263 }
271 } 264 }
272 if (off + c.slen < off) { 265 if (off + c.slen < off) {
273 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ASN1_R_TOO_LONG); 266 ASN1error(ASN1_R_TOO_LONG);
274 goto err; 267 goto err;
275 } 268 }
276 off += c.slen; 269 off += c.slen;
@@ -282,7 +275,7 @@ asn1_d2i_read_bio(BIO *in, BUF_MEM **pb)
282 } 275 }
283 276
284 if (off > INT_MAX) { 277 if (off > INT_MAX) {
285 ASN1err(ASN1_F_ASN1_D2I_READ_BIO, ASN1_R_TOO_LONG); 278 ASN1error(ASN1_R_TOO_LONG);
286 goto err; 279 goto err;
287 } 280 }
288 281