- Better handling of extension parsing

diff --git a/library/x509parse.c b/library/x509parse.c
index 56fd809..47aae2a 100644
--- a/library/x509parse.c
+++ b/library/x509parse.c
@@ -614,7 +614,7 @@
     int ret, len;
     int is_critical = 1;
     int is_cacert   = 0;
-    unsigned char *end2;
+    unsigned char *end_ext_data, *end_ext_octet;
 
     if( ( ret = x509_get_ext( p, end, ext ) ) != 0 )
     {
@@ -630,6 +630,8 @@
                 ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
             return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS | ret );
 
+        end_ext_data = *p + len;
+
         if( memcmp( *p, "\x06\x03\x55\x1D\x13", 5 ) != 0 )
         {
             *p += len;
@@ -638,11 +640,11 @@
 
         *p += 5;
 
-        if( ( ret = asn1_get_bool( p, end, &is_critical ) ) != 0 &&
+        if( ( ret = asn1_get_bool( p, end_ext_data, &is_critical ) ) != 0 &&
             ( ret != POLARSSL_ERR_ASN1_UNEXPECTED_TAG ) )
             return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS | ret );
 
-        if( ( ret = asn1_get_tag( p, end, &len,
+        if( ( ret = asn1_get_tag( p, end_ext_data, &len,
                 ASN1_OCTET_STRING ) ) != 0 )
             return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS | ret );
 
@@ -651,19 +653,23 @@
          *      cA                      BOOLEAN DEFAULT FALSE,
          *      pathLenConstraint       INTEGER (0..MAX) OPTIONAL }
          */
-        end2 = *p + len;
+        end_ext_octet = *p + len;
+        
+        if( end_ext_octet != end_ext_data )
+            return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS |
+                    POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
 
-        if( ( ret = asn1_get_tag( p, end2, &len,
+        if( ( ret = asn1_get_tag( p, end_ext_octet, &len,
                 ASN1_CONSTRUCTED | ASN1_SEQUENCE ) ) != 0 )
             return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS | ret );
 
-        if( *p == end2 )
+        if( *p == end_ext_octet )
             continue;
 
-        if( ( ret = asn1_get_bool( p, end2, &is_cacert ) ) != 0 )
+        if( ( ret = asn1_get_bool( p, end_ext_octet, &is_cacert ) ) != 0 )
         {
             if( ret == POLARSSL_ERR_ASN1_UNEXPECTED_TAG )
-                ret = asn1_get_int( p, end2, &is_cacert );
+                ret = asn1_get_int( p, end_ext_octet, &is_cacert );
 
             if( ret != 0 )
                 return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS | ret );
@@ -672,13 +678,13 @@
                 is_cacert  = 1;
         }
 
-        if( *p == end2 )
+        if( *p == end_ext_octet )
             continue;
 
-        if( ( ret = asn1_get_int( p, end2, max_pathlen ) ) != 0 )
+        if( ( ret = asn1_get_int( p, end_ext_octet, max_pathlen ) ) != 0 )
             return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS | ret );
 
-        if( *p != end2 )
+        if( *p != end_ext_octet )
             return( POLARSSL_ERR_X509_CERT_INVALID_EXTENSIONS |
                     POLARSSL_ERR_ASN1_LENGTH_MISMATCH );