[PATCH 3/9] adsldp: Add support for NAME token with multiple entries.

Dmitry Timoshkov dmitry at baikal.ru
Mon Mar 30 02:33:33 CDT 2020


Signed-off-by: Dmitry Timoshkov <dmitry at baikal.ru>
---
 dlls/adsldp/adsldp_private.h |  1 +
 dlls/adsldp/schema.c         | 76 +++++++++++++++++++++++++++++++++---
 2 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/dlls/adsldp/adsldp_private.h b/dlls/adsldp/adsldp_private.h
index bf24de2385..a0d3a977a2 100644
--- a/dlls/adsldp/adsldp_private.h
+++ b/dlls/adsldp/adsldp_private.h
@@ -50,6 +50,7 @@ struct attribute_type
 {
     WCHAR *oid;
     WCHAR *name;
+    ULONG name_count;
     WCHAR *syntax;
     int single_value;
 };
diff --git a/dlls/adsldp/schema.c b/dlls/adsldp/schema.c
index 06e61f258a..1f02916496 100644
--- a/dlls/adsldp/schema.c
+++ b/dlls/adsldp/schema.c
@@ -32,10 +32,20 @@ WINE_DEFAULT_DEBUG_CHANNEL(adsldp);
 
 static const struct attribute_type *find_schema_type(const WCHAR *name, const struct attribute_type *at, ULONG count)
 {
-    ULONG i;
+    ULONG i, n, off;
 
     for (i = 0; i < count; i++)
-        if (at[i].name && !wcsicmp(at[i].name, name)) return &at[i];
+    {
+        if (!at[i].name) continue;
+
+        off = 0;
+
+        for (n = 0; n < at[i].name_count; n++)
+        {
+            if (!wcsicmp(at[i].name + off, name)) return &at[i];
+            off += wcslen(at[i].name + off) + 1;
+        }
+    }
 
     return NULL;
 }
@@ -114,13 +124,64 @@ static WCHAR *parse_oid(WCHAR **str)
     return oid;
 }
 
-static WCHAR *parse_name(WCHAR **str)
+static WCHAR *parse_name(WCHAR **str, ULONG *name_count)
 {
     WCHAR *name, *p = *str, *end;
     int count;
 
+    *name_count = 0;
+
     while (is_space(*p)) p++;
 
+    if (*p == '(')
+    {
+        int total_count = 0;
+
+        p++;
+        name = NULL;
+
+        while (*p)
+        {
+            WCHAR *tmp_name, *new_name;
+            ULONG dummy;
+
+            while (is_space(*p)) p++;
+            if (*p == ')')
+            {
+                *str = p + 1;
+                return name;
+            }
+
+            tmp_name = parse_name(&p, &dummy);
+            if (!tmp_name) break;
+
+            TRACE("NAME[%u] %s\n", *name_count, debugstr_w(tmp_name));
+
+            count = wcslen(tmp_name);
+
+            if (!name)
+                new_name = heap_alloc((count + 1) * sizeof(WCHAR));
+            else
+                new_name = heap_realloc(name, (total_count + count + 1) * sizeof(WCHAR));
+
+            if (!new_name) break;
+
+            memcpy(new_name + total_count, tmp_name, (count + 1) * sizeof(WCHAR));
+
+            name = new_name;
+            heap_free(tmp_name);
+            total_count += count + 1;
+
+            *name_count += 1;
+            *str = p;
+        }
+
+        *str = *p ? p + 1 : p;
+
+        heap_free(name);
+        return NULL;
+    }
+
     if (*p != '\'')
     {
         FIXME("not suported NAME start at %s\n", debugstr_w(p));
@@ -138,6 +199,8 @@ static WCHAR *parse_name(WCHAR **str)
     memcpy(name, p, count * sizeof(WCHAR));
     name[count] = 0;
 
+    *name_count = 1;
+
     *str = end + 1;
 
     return name;
@@ -171,6 +234,7 @@ static BOOL parse_attribute_type(WCHAR *str, struct attribute_type *at)
 
     at->oid = NULL;
     at->name = NULL;
+    at->name_count = 0;
     at->syntax = NULL;
     at->single_value = 0;
 
@@ -188,7 +252,7 @@ static BOOL parse_attribute_type(WCHAR *str, struct attribute_type *at)
         if (!wcsnicmp(p, L"NAME", 4))
         {
             p += 4;
-            at->name = parse_name(&p);
+            at->name = parse_name(&p, &at->name_count);
         }
         else if (!wcsnicmp(p, L"SYNTAX", 6))
         {
@@ -292,8 +356,8 @@ struct attribute_type *load_schema(LDAP *ld, ULONG *at_count)
                     continue;
                 }
 
-                TRACE("oid %s, name %s, syntax %s, single-value %d\n", debugstr_w(at[count].oid),
-                      debugstr_w(at[count].name), debugstr_w(at[count].syntax), at[count].single_value);
+                TRACE("oid %s, name %s, name_count %u, syntax %s, single-value %d\n", debugstr_w(at[count].oid),
+                      debugstr_w(at[count].name), at[count].name_count, debugstr_w(at[count].syntax), at[count].single_value);
 
                 count++;
             }
-- 
2.25.1




More information about the wine-devel mailing list