[PATCH v2 3/4] dnsapi: Return a double-null-terminated string from DnsQueryConfig(DnsConfigSearchList).
Zebediah Figura
wine at gitlab.winehq.org
Fri Jun 24 15:34:36 CDT 2022
From: Zebediah Figura <zfigura at codeweavers.com>
DNS_TEXT_DATA contains pointers and is thus not WoW64 compatible. Since the API
is internal to Wine, use a simpler format instead of fixing our WoW64
translation.
The problem was found by Brendan Shanks; this solution was suggested by Hans Leidekker.
---
dlls/dnsapi/dnsapi.h | 2 +-
dlls/dnsapi/libresolv.c | 21 ++++++++-------------
dlls/iphlpapi/iphlpapi_main.c | 6 +++---
3 files changed, 12 insertions(+), 17 deletions(-)
diff --git a/dlls/dnsapi/dnsapi.h b/dlls/dnsapi/dnsapi.h
index f27cce9a99d..a81cb712f3e 100644
--- a/dlls/dnsapi/dnsapi.h
+++ b/dlls/dnsapi/dnsapi.h
@@ -128,7 +128,7 @@ extern const char *debugstr_type( unsigned short ) DECLSPEC_HIDDEN;
struct get_searchlist_params
{
- DNS_TXT_DATAW *list;
+ WCHAR *list;
DWORD *len;
};
diff --git a/dlls/dnsapi/libresolv.c b/dlls/dnsapi/libresolv.c
index 51a44f88aa5..fd645d53fd7 100644
--- a/dlls/dnsapi/libresolv.c
+++ b/dlls/dnsapi/libresolv.c
@@ -125,16 +125,15 @@ 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;
+ WCHAR *list = params->list;
+ 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;
+ needed += (strlen(_res.dnsrch[i]) + 1) * sizeof(WCHAR);
+ needed += sizeof(WCHAR); /* null terminator */
if (!list || *params->len < needed)
{
@@ -143,16 +142,12 @@ static NTSTATUS resolv_get_searchlist( void *args )
}
*params->len = needed;
- list->dwStringCount = i;
- ptr = (WCHAR *)(list->pStringArray + i);
- end = ptr + str_needed / sizeof(WCHAR);
+ ptr = list;
+ end = ptr + needed / sizeof(WCHAR);
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 += ntdll_umbstowcs( _res.dnsrch[i], strlen(_res.dnsrch[i]) + 1, ptr, end - ptr );
+ *ptr = 0; /* null terminator */
return ERROR_SUCCESS;
}
diff --git a/dlls/iphlpapi/iphlpapi_main.c b/dlls/iphlpapi/iphlpapi_main.c
index 65d3793011b..a95a581532f 100644
--- a/dlls/iphlpapi/iphlpapi_main.c
+++ b/dlls/iphlpapi/iphlpapi_main.c
@@ -1138,7 +1138,7 @@ static DWORD dns_info_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG family, ULONG flags
DWORD err, i, size, attempt, sockaddr_len;
WCHAR name[MAX_ADAPTER_NAME_LENGTH + 1];
DNS_ADDR_ARRAY *servers;
- DNS_TXT_DATAW *search;
+ WCHAR *search;
while (aa)
{
@@ -1192,9 +1192,9 @@ static DWORD dns_info_alloc( IP_ADAPTER_ADDRESSES *aa, ULONG family, ULONG flags
(search = heap_alloc( size )))
{
if (!DnsQueryConfig( DnsConfigSearchList, 0, name, NULL, search, &size ) &&
- search->dwStringCount && wcslen( search->pStringArray[0] ) < MAX_DNS_SUFFIX_STRING_LENGTH)
+ search[0] && wcslen( search ) < MAX_DNS_SUFFIX_STRING_LENGTH)
{
- wcscpy( aa->DnsSuffix, search->pStringArray[0] );
+ wcscpy( aa->DnsSuffix, search );
}
heap_free( search );
}
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/307
More information about the wine-devel
mailing list