From: Zebediah Figura Subject: [PATCH 2/4] dnsapi: Build the DNS_TXT_DATAW header on the PE side. Message-Id: Date: Thu, 23 Jun 2022 23:47:40 +0000 In-Reply-To: References: From: Zebediah Figura 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