[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, ¶ms );
+ 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, ¶ms )))
+ 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, ¶ms )))
+ {
+ 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