Make the ver_chain length explicit
diff --git a/library/x509_crt.c b/library/x509_crt.c
index 676dcfb..18dffae 100644
--- a/library/x509_crt.c
+++ b/library/x509_crt.c
@@ -2086,22 +2086,25 @@
                 mbedtls_x509_crt *trust_ca,
                 mbedtls_x509_crl *ca_crl,
                 const mbedtls_x509_crt_profile *profile,
-                x509_crt_verify_chain_item ver_chain[X509_MAX_VERIFY_CHAIN_SIZE] )
+                x509_crt_verify_chain_item ver_chain[X509_MAX_VERIFY_CHAIN_SIZE],
+                size_t *chain_len )
 {
     uint32_t *flags;
     mbedtls_x509_crt *child;
     mbedtls_x509_crt *parent;
     int parent_is_trusted = 0;
     int child_is_trusted = 0;
-    int path_cnt = 0;
+    int path_cnt = 0; /* like chain_len but not updated at the same time */
     int self_cnt = 0;
 
     child = crt;
+    *chain_len = 0;
 
     while( 1 ) {
         /* Add certificate to the verification chain */
         ver_chain[path_cnt].crt = child;
         flags = &ver_chain[path_cnt].flags;
+        ++*chain_len;
 
         /* Check time-validity (all certificates) */
         if( mbedtls_x509_time_is_past( &child->valid_to ) )
@@ -2245,18 +2248,16 @@
 static int x509_crt_merge_flags_with_cb(
            uint32_t *flags,
            x509_crt_verify_chain_item ver_chain[X509_MAX_VERIFY_CHAIN_SIZE],
+           size_t chain_len,
            int (*f_vrfy)(void *, mbedtls_x509_crt *, int, uint32_t *),
            void *p_vrfy )
 {
     int ret;
-    size_t i, j;
+    size_t i;
     uint32_t cur_flags;
 
-    for( i = X509_MAX_VERIFY_CHAIN_SIZE; i != 0; --i )
+    for( i = chain_len; i != 0; --i )
     {
-        if( ver_chain[i-1].crt == NULL )
-            continue;
-
         cur_flags = ver_chain[i-1].flags;
 
         if( NULL != f_vrfy )
@@ -2302,10 +2303,12 @@
     int ret;
     mbedtls_pk_type_t pk_type;
     x509_crt_verify_chain_item ver_chain[X509_MAX_VERIFY_CHAIN_SIZE];
+    size_t chain_len;
     uint32_t *ee_flags = &ver_chain[0].flags;
 
     *flags = 0;
     memset( ver_chain, 0, sizeof( ver_chain ) );
+    chain_len = 0;
 
     if( profile == NULL )
     {
@@ -2327,12 +2330,14 @@
         *ee_flags |= MBEDTLS_X509_BADCERT_BAD_KEY;
 
     /* Check the chain */
-    ret = x509_crt_verify_chain( crt, trust_ca, ca_crl, profile, ver_chain );
+    ret = x509_crt_verify_chain( crt, trust_ca, ca_crl, profile,
+                                 ver_chain, &chain_len );
     if( ret != 0 )
         goto exit;
 
     /* Build final flags, calling callback on the way if any */
-    ret = x509_crt_merge_flags_with_cb( flags, ver_chain, f_vrfy, p_vrfy );
+    ret = x509_crt_merge_flags_with_cb( flags,
+                                        ver_chain, chain_len, f_vrfy, p_vrfy );
 
 exit:
     /* prevent misuse of the vrfy callback - VERIFY_FAILED would be ignored by