[PATCH 2/4] dnsapi: Build the DNS_TXT_DATAW header on the PE side.

Zebediah Figura wine at gitlab.winehq.org
Thu Jun 23 18:47:40 CDT 2022


From: Zebediah Figura <zfigura at codeweavers.com>

It contains pointers, which is not compatible with WoW64.
---
 dlls/dnsapi/dnsapi.h    |  3 ++-
 dlls/dnsapi/libresolv.c | 30 ++++++++++++++----------------
 dlls/dnsapi/query.c     | 37 +++++++++++++++++++++++++++++++++++--
 3 files changed, 51 insertions(+), 19 deletions(-)

diff --git a/dlls/dnsapi/dnsapi.h b/dlls/dnsapi/dnsapi.h
index f27cce9a99d..6794e7faf52 100644
--- a/dlls/dnsapi/dnsapi.h
+++ b/dlls/dnsapi/dnsapi.h
@@ -128,7 +128,8 @@ extern const char *debugstr_type( unsigned short ) DECLSPEC_HIDDEN;
 
 struct get_searchlist_params
 {
-    DNS_TXT_DATAW   *list;
+    WCHAR           *list;
+    unsigned int    *count;
     DWORD           *len;
 };
 
diff --git a/dlls/dnsapi/libresolv.c b/dlls/dnsapi/libresolv.c
index 1a49f0e5652..73b411c478c 100644
--- a/dlls/dnsapi/libresolv.c
+++ b/dlls/dnsapi/libresolv.c
@@ -125,33 +125,29 @@ static DNS_STATUS map_h_errno( int error )
 static NTSTATUS resolv_get_searchlist( void *args )
 {
     const struct get_searchlist_params *params = args;
-    DNS_TXT_DATAW *list = params->list;
-    DWORD i, needed, str_needed = 0;
+    const DWORD len = *params->len;
+    DWORD i, needed = 0;
     WCHAR *ptr, *end;
 
     init_resolver();
 
     for (i = 0; i < MAXDNSRCH + 1 && _res.dnsrch[i]; i++)
-        str_needed += (strlen(_res.dnsrch[i]) + 1) * sizeof(WCHAR);
-
-    needed = FIELD_OFFSET(DNS_TXT_DATAW, pStringArray[i]) + str_needed;
-
-    if (!list || *params->len < needed)
-    {
-        *params->len = needed;
-        return !list ? ERROR_SUCCESS : ERROR_MORE_DATA;
-    }
+        needed += (strlen(_res.dnsrch[i]) + 1) * sizeof(WCHAR);
 
+    *params->count = i;
     *params->len = needed;
-    list->dwStringCount = i;
 
-    ptr = (WCHAR *)(list->pStringArray + i);
-    end = ptr + str_needed;
+    if (!params->list)
+        return ERROR_SUCCESS;
+    if (len < needed)
+        return ERROR_MORE_DATA;
+
+    ptr = params->list;
+    end = ptr + needed;
     for (i = 0; i < MAXDNSRCH + 1 && _res.dnsrch[i]; i++)
     {
-        list->pStringArray[i] = ptr;
         ptr += ntdll_umbstowcs( _res.dnsrch[i], strlen(_res.dnsrch[i]) + 1,
-                                list->pStringArray[i], end - ptr );
+                                ptr, end - ptr );
     }
     return ERROR_SUCCESS;
 }
@@ -358,12 +354,14 @@ static NTSTATUS wow64_resolv_get_searchlist( void *args )
     struct
     {
         PTR32  list;
+        PTR32  count;
         PTR32  len;
     } const *params32 = args;
 
     struct get_searchlist_params params =
     {
         ULongToPtr(params32->list),
+        ULongToPtr(params32->count),
         ULongToPtr(params32->len)
     };
 
diff --git a/dlls/dnsapi/query.c b/dlls/dnsapi/query.c
index 12aa1086540..0686a5b83ce 100644
--- a/dlls/dnsapi/query.c
+++ b/dlls/dnsapi/query.c
@@ -389,8 +389,41 @@ DNS_STATUS WINAPI DnsQueryConfig( DNS_CONFIG_TYPE config, DWORD flag, const WCHA
     }
     case DnsConfigSearchList:
     {
-        struct get_searchlist_params params = { buffer, len };
-        return RESOLV_CALL( get_searchlist, &params );
+        struct get_searchlist_params params;
+        DNS_TXT_DATAW *data = buffer;
+        unsigned int i, count, needed;
+        DWORD list_len = *len;
+        WCHAR *p;
+
+        params.list = NULL;
+        params.count = &count;
+        params.len = &list_len;
+        if ((ret = RESOLV_CALL( get_searchlist, &params )))
+            return ret;
+        needed = FIELD_OFFSET(DNS_TXT_DATAW, pStringArray[count]) + list_len;
+
+        if (!buffer || *len < needed)
+        {
+            *len = needed;
+            return !buffer ? ERROR_SUCCESS : ERROR_MORE_DATA;
+        }
+        *len = needed;
+
+        params.list = (WCHAR *)&data->pStringArray[count];
+        if ((ret = RESOLV_CALL( get_searchlist, &params )))
+        {
+            ERR( "failed to get search list, error %lu\n", ret );
+            return ret;
+        }
+
+        p = params.list;
+        data->dwStringCount = count;
+        for (i = 0; i < count; ++i)
+        {
+            data->pStringArray[i] = p;
+            p += wcslen( p ) + 1;
+        }
+        return ret;
     }
     default:
         WARN( "unknown config type: %d\n", config );
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/307



More information about the wine-devel mailing list