Make x509_crl_parse() iterative
diff --git a/library/x509_crl.c b/library/x509_crl.c
index 6ad9d00..c8101b5 100644
--- a/library/x509_crl.c
+++ b/library/x509_crl.c
@@ -489,52 +489,54 @@
  */
 int x509_crl_parse( x509_crl *chain, const unsigned char *buf, size_t buflen )
 {
+#if defined(POLARSSL_PEM_PARSE_C)
     int ret;
+    size_t use_len;
+    pem_context pem;
+    int is_pem = 0;
 
     if( chain == NULL || buf == NULL )
         return( POLARSSL_ERR_X509_BAD_INPUT_DATA );
 
-#if defined(POLARSSL_PEM_PARSE_C)
-    size_t use_len;
-    pem_context pem;
-
-    pem_init( &pem );
-    ret = pem_read_buffer( &pem,
-                           "-----BEGIN X509 CRL-----",
-                           "-----END X509 CRL-----",
-                           buf, NULL, 0, &use_len );
-
-    if( ret == 0 )
+    do
     {
-        /*
-         * Was PEM encoded
-         */
-        buflen -= use_len;
-        buf += use_len;
+        pem_init( &pem );
+        ret = pem_read_buffer( &pem,
+                               "-----BEGIN X509 CRL-----",
+                               "-----END X509 CRL-----",
+                               buf, NULL, 0, &use_len );
 
-        if( ( ret = x509_crl_parse_der( chain, pem.buf, pem.buflen ) ) != 0 )
+        if( ret == 0 )
+        {
+            /*
+             * Was PEM encoded
+             */
+            is_pem = 1;
+
+            buflen -= use_len;
+            buf += use_len;
+
+            if( ( ret = x509_crl_parse_der( chain,
+                                            pem.buf, pem.buflen ) ) != 0 )
+            {
+                return( ret );
+            }
+
+            pem_free( &pem );
+        }
+        else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
+        {
+            pem_free( &pem );
             return( ret );
+        }
+    }
+    while( is_pem && buflen > 0 );
 
-        pem_free( &pem );
-    }
-    else if( ret != POLARSSL_ERR_PEM_NO_HEADER_FOOTER_PRESENT )
-    {
-        pem_free( &pem );
-        return( ret );
-    }
+    if( is_pem )
+        return( 0 );
     else
 #endif /* POLARSSL_PEM_PARSE_C */
-    {
-        if( ( ret = x509_crl_parse_der( chain, buf, buflen ) ) != 0 )
-            return( ret );
-
-        buflen = 0;
-    }
-
-    if( buflen > 0 )
-        return( x509_crl_parse( chain, buf, buflen ) );
-
-    return( 0 );
+        return( x509_crl_parse_der( chain, buf, buflen ) );
 }
 
 #if defined(POLARSSL_FS_IO)