Skip to content

Commit 2ca0cc1

Browse files
committed
Implement feedback
1 parent 3b22148 commit 2ca0cc1

File tree

1 file changed

+25
-15
lines changed

1 file changed

+25
-15
lines changed

crypto/asn1/asn1_par.c

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656

5757
#include <openssl/asn1.h>
5858
#include <openssl/bio.h>
59+
#include "../internal.h"
5960

6061
// Forward declarations
6162
static int asn1_parse2(BIO *bp, const uint8_t **pp, long length, int offset,
@@ -117,6 +118,8 @@ const char *ASN1_tag2str(int tag) {
117118
}
118119

119120
int ASN1_parse(BIO *bp, const unsigned char *pp, long len, int indent) {
121+
GUARD_PTR(bp);
122+
GUARD_PTR(pp);
120123
return asn1_parse2(bp, &pp, len, 0, 0, indent, 0);
121124
}
122125

@@ -173,21 +176,21 @@ static int asn1_parse_constructed_type(
173176
const unsigned char *original_start, long *object_length, int parse_flags,
174177
int offset, int depth, int indent, int dump) {
175178
const unsigned char *start_pos = *current_pos;
176-
const unsigned char *constructed_end = *current_pos + *object_length;
177-
int parse_result;
178179

179-
if (!bp || !current_pos || !total_end || !original_start || !object_length) {
180-
return 0;
181-
}
180+
GUARD_PTR(bp);
181+
GUARD_PTR(current_pos);
182+
GUARD_PTR(total_end);
183+
GUARD_PTR(original_start);
184+
GUARD_PTR(object_length);
182185

183186
if (BIO_write(bp, "\n", 1) <= 0) {
184187
return 0;
185188
}
186189

187-
if ((parse_flags == 0x21) && (*object_length == 0)) {
190+
if ((parse_flags == (V_ASN1_CONSTRUCTED | 1)) && (*object_length == 0)) {
188191
// Indefinite length constructed object
189192
for (;;) {
190-
parse_result = asn1_parse2(
193+
const int parse_result = asn1_parse2(
191194
bp, current_pos, (long)(total_end - *current_pos),
192195
offset + (*current_pos - original_start), depth + 1, indent, dump);
193196
if (parse_result == 0) {
@@ -200,13 +203,18 @@ static int asn1_parse_constructed_type(
200203
}
201204
} else {
202205
// Definite length constructed object
206+
const unsigned char *constructed_end = *current_pos + *object_length;
203207
long remaining_length = *object_length;
204208

209+
if(constructed_end > total_end) {
210+
return 0;
211+
}
212+
205213
while (*current_pos < constructed_end) {
206214
start_pos = *current_pos;
207-
parse_result = asn1_parse2(bp, current_pos, remaining_length,
208-
offset + (*current_pos - original_start),
209-
depth + 1, indent, dump);
215+
const int parse_result = asn1_parse2(
216+
bp, current_pos, remaining_length,
217+
offset + (*current_pos - original_start), depth + 1, indent, dump);
210218
if (parse_result == 0) {
211219
return 0;
212220
}
@@ -242,6 +250,9 @@ static int asn1_parse_primitive_type(BIO *bp, const unsigned char *object_start,
242250
if (BIO_write(bp, ":", 1) <= 0) {
243251
goto end;
244252
}
253+
if(object_length > INT_MAX) {
254+
return 0;
255+
}
245256
if ((object_length > 0) &&
246257
BIO_write(bp, (const char *)current_pos, (int)object_length) !=
247258
(int)object_length) {
@@ -444,13 +455,12 @@ static int asn1_parse_primitive_type(BIO *bp, const unsigned char *object_start,
444455
static int asn1_parse2(BIO *bp, const unsigned char **pp, long length,
445456
int offset, int depth, int indent, int dump) {
446457
const unsigned char *current_pos, *total_end, *object_start;
447-
long object_length;
458+
long object_length = 0;
448459
int tag, xclass, return_value = 0;
449-
int header_length, parse_flags;
460+
int header_length = 0, parse_flags = 0;
450461

451-
if (!bp || !pp) {
452-
return 0;
453-
}
462+
GUARD_PTR(bp);
463+
GUARD_PTR(pp);
454464

455465
if (depth > ASN1_PARSE_MAXDEPTH) {
456466
BIO_puts(bp, "BAD RECURSION DEPTH\n");

0 commit comments

Comments
 (0)