diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2014-06-28 14:04:36 +0100 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2014-06-29 00:07:08 +0100 |
commit | 0e7bda79a1f60f85873b12135bb29f67ccccf8c8 (patch) | |
tree | 44db7d90b498ee9c74e5d2107e8854c6589fa0ed /crypto/asn1 | |
parent | a356e488ad50ca9de3fc4955839441c5aff11ed3 (diff) | |
download | openssl-0e7bda79a1f60f85873b12135bb29f67ccccf8c8.tar.gz |
Handle BER length encoding.
Tolerate BER length encoding which may include leading zeroes.
PR#2746
Diffstat (limited to 'crypto/asn1')
-rw-r--r-- | crypto/asn1/asn1_lib.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/crypto/asn1/asn1_lib.c b/crypto/asn1/asn1_lib.c index 1bcb44aee2..74ca7d4fa3 100644 --- a/crypto/asn1/asn1_lib.c +++ b/crypto/asn1/asn1_lib.c @@ -170,14 +170,20 @@ static int asn1_get_length(const unsigned char **pp, int *inf, long *rl, int max i= *p&0x7f; if (*(p++) & 0x80) { + if (max < (int)i) + return 0; + /* Skip leading zeroes */ + while (i && *p == 0) + { + p++; + i--; + } if (i > sizeof(long)) return 0; - if (max-- == 0) return(0); while (i-- > 0) { ret<<=8L; ret|= *(p++); - if (max-- == 0) return(0); } } else |