Convert X.509 name buffer to linked list via name traversal callback
diff --git a/library/x509.c b/library/x509.c
index 8b63572..72cadd0 100644
--- a/library/x509.c
+++ b/library/x509.c
@@ -601,41 +601,47 @@
     return( ret );
 }
 
+static int x509_get_name_cb( void *ctx,
+                             mbedtls_x509_buf *oid,
+                             mbedtls_x509_buf *val,
+                             int next_merged )
+{
+    mbedtls_x509_name **cur_ptr = (mbedtls_x509_name**) ctx;
+    mbedtls_x509_name *cur = *cur_ptr;
+
+    if( cur->oid.p != NULL )
+    {
+        cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) );
+        if( cur->next == NULL )
+            return( MBEDTLS_ERR_ASN1_ALLOC_FAILED );
+
+        cur = cur->next;
+    }
+
+    cur->oid = *oid;
+    cur->val = *val;
+    cur->next_merged = next_merged;
+
+    *cur_ptr = cur;
+    return( 0 );
+}
 
 int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end,
                            mbedtls_x509_name *cur )
 {
     int ret;
-    const unsigned char *end_set;
+    mbedtls_x509_buf_raw name_buf = { *p, end - *p };
+    memset( cur, 0, sizeof( mbedtls_x509_name ) );
+    ret = mbedtls_x509_name_cmp_raw( &name_buf, &name_buf,
+                                     x509_get_name_cb,
+                                     &cur );
+    if( ret != 0 )
+        return( ret );
 
-    end_set = *p;
-    while( 1 )
-    {
-        ret = x509_set_sequence_iterate( p, &end_set, end,
-                                         &cur->oid, &cur->val );
-        if( ret != 0 )
-            return( ret + MBEDTLS_ERR_X509_INVALID_NAME );
-
-        if( *p != end_set )
-            cur->next_merged = 1;
-
-        if( *p == end )
-        {
-            cur->next = NULL;
-            break;
-        }
-
-        cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) );
-        if( cur->next == NULL )
-            return( MBEDTLS_ERR_X509_ALLOC_FAILED );
-
-        cur = cur->next;
-    }
-
+    *p = (unsigned char*) end;
     return( 0 );
 }
 
-
 static int x509_parse_int( unsigned char **p, size_t n, int *res )
 {
     *res = 0;