aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/asn1
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2014-06-28 14:04:36 +0100
committerDr. Stephen Henson <steve@openssl.org>2014-06-29 00:07:08 +0100
commit0e7bda79a1f60f85873b12135bb29f67ccccf8c8 (patch)
tree44db7d90b498ee9c74e5d2107e8854c6589fa0ed /crypto/asn1
parenta356e488ad50ca9de3fc4955839441c5aff11ed3 (diff)
downloadopenssl-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.c10
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