X-Git-Url: https://git.openssl.org/?a=blobdiff_plain;f=crypto%2Fasn1%2Fasn1_par.c;fp=crypto%2Fasn1%2Fasn1_par.c;h=b721273cf1757f32198ffc36bbc9af06366948a3;hb=79c7f74d6cefd5d32fa20e69195ad3de834ce065;hp=773b8b2ee3e03310c752f2db6d66a8b97da4b6f2;hpb=087ca80ad83071dde0bb6bc1c28c743caa00eaf8;p=openssl.git diff --git a/crypto/asn1/asn1_par.c b/crypto/asn1/asn1_par.c index 773b8b2ee3..b721273cf1 100644 --- a/crypto/asn1/asn1_par.c +++ b/crypto/asn1/asn1_par.c @@ -164,6 +164,8 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, if (!asn1_print_info(bp, tag, xclass, j, (indent) ? depth : 0)) goto end; if (j & V_ASN1_CONSTRUCTED) { + const unsigned char *sp = p; + ep = p + len; if (BIO_write(bp, "\n", 1) <= 0) goto end; @@ -181,19 +183,25 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, ret = 0; goto end; } - if ((r == 2) || (p >= tot)) + if ((r == 2) || (p >= tot)) { + len = p - sp; break; + } } - } else + } else { while (p < ep) { - r = asn1_parse2(bp, &p, (long)len, + sp = p; + r = asn1_parse2(bp, &p, len, offset + (p - *pp), depth + 1, indent, dump); if (r == 0) { ret = 0; goto end; } + len -= p - sp; } + len = length; + } } else if (xclass != 0) { p += len; if (BIO_write(bp, "\n", 1) <= 0) @@ -229,7 +237,8 @@ static int asn1_parse2(BIO *bp, const unsigned char **pp, long length, goto end; dump_cont = 1; } - BIO_printf(bp, ":%u", p[0]); + if (len > 0) + BIO_printf(bp, ":%u", p[0]); } else if (tag == V_ASN1_BMPSTRING) { /* do the BMP thang */ } else if (tag == V_ASN1_OCTET_STRING) {