- Added input handling for x509parse_crt()
 - Prevented memory leak by only adding new certificate if needed in x509parse_crt()
 - Add certificate before parsing if chain is 'full' in x509parse_crt()

diff --git a/library/x509parse.c b/library/x509parse.c
index 9b68af4..2596559 100644
--- a/library/x509parse.c
+++ b/library/x509parse.c
@@ -657,10 +657,33 @@
 
     crt = chain;
 
-    while( crt->version != 0 )
+    /*
+     * Check for valid input
+     */
+    if( crt == NULL || buf == NULL )
+        return( 1 );
+
+    while( crt->version != 0 || crt->next != NULL )
         crt = crt->next;
 
     /*
+     * Add new certificate on the end of the chain if needed.
+     */
+    if ( crt->next == NULL)
+    {
+        crt->next = (x509_cert *) malloc( sizeof( x509_cert ) );
+
+	if( crt->next == NULL )
+	{
+            x509_free( crt );
+	    return( 1 );
+	}
+
+	crt = crt->next;
+	memset( crt, 0, sizeof( x509_cert ) );
+    }
+
+    /*
      * check if the certificate is encoded in base64
      */
     s1 = (unsigned char *) strstr( (char *) buf,
@@ -942,7 +965,7 @@
         return( ret );
     }
 
-    if( memcmp( crt->sig_oid1.p, crt->sig_oid2.p, 9 ) != 0 )
+    if( memcmp( crt->sig_oid1.p, crt->sig_oid2.p, crt->sig_oid1.len ) != 0 )
     {
           x509_free( crt );
         return( POLARSSL_ERR_X509_CERT_SIG_MISMATCH );
@@ -961,19 +984,21 @@
                 POLARSSL_ERR_ASN1_LENGTH_MISMATCH );
     }
 
-    crt->next = (x509_cert *) malloc( sizeof( x509_cert ) );
-
-    if( crt->next == NULL )
-    {
-          x509_free( crt );
-        return( 1 );
-    }
-
-    crt = crt->next;
-    memset( crt, 0, sizeof( x509_cert ) );
-
     if( buflen > 0 )
+    {
+        crt->next = (x509_cert *) malloc( sizeof( x509_cert ) );
+
+	if( crt->next == NULL )
+	{
+            x509_free( crt );
+	    return( 1 );
+	}
+
+	crt = crt->next;
+	memset( crt, 0, sizeof( x509_cert ) );
+
         return( x509parse_crt( crt, buf, buflen ) );
+    }
 
     return( 0 );
 }