From 0529e5b4b1ec45bc2f1a32b17003cb3f9e07410e Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Fri, 1 Mar 2019 17:37:34 +0100 Subject: [PATCH] dnsapi: Fix data length returned for records that contain Unicode strings. Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/dnsapi/record.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/dlls/dnsapi/record.c b/dlls/dnsapi/record.c index 8d7b17af645..dc6a1137d95 100644 --- a/dlls/dnsapi/record.c +++ b/dlls/dnsapi/record.c @@ -21,6 +21,7 @@ #include "config.h" #include "wine/port.h" #include "wine/debug.h" +#include "wine/unicode.h" #include #include @@ -480,6 +481,11 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET heap_free( dst->Data.MINFO.pNameMailbox ); goto error; } + + dst->wDataLength = sizeof(dst->Data.MINFO); + if (out == DnsCharSetUnicode) dst->wDataLength += + (strlenW( dst->Data.MINFO.pNameMailbox ) + 1) * sizeof(WCHAR) + + (strlenW( dst->Data.MINFO.pNameErrorsMailbox ) + 1) * sizeof(WCHAR); break; } case DNS_TYPE_AFSDB: @@ -489,6 +495,10 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET dst->Data.MX.pNameExchange = dns_strcpyX( src->Data.MX.pNameExchange, in, out ); if (!dst->Data.MX.pNameExchange) goto error; + + dst->wDataLength = sizeof(dst->Data.MX); + if (out == DnsCharSetUnicode) dst->wDataLength += + (strlenW( dst->Data.MX.pNameExchange ) + 1) * sizeof(WCHAR); break; } case DNS_TYPE_NXT: @@ -496,6 +506,10 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET dst->Data.NXT.pNameNext = dns_strcpyX( src->Data.NXT.pNameNext, in, out ); if (!dst->Data.NXT.pNameNext) goto error; + + dst->wDataLength = sizeof(dst->Data.NXT); + if (out == DnsCharSetUnicode) dst->wDataLength += + (strlenW( dst->Data.NXT.pNameNext ) + 1) * sizeof(WCHAR); break; } case DNS_TYPE_CNAME: @@ -510,6 +524,10 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET dst->Data.PTR.pNameHost = dns_strcpyX( src->Data.PTR.pNameHost, in, out ); if (!dst->Data.PTR.pNameHost) goto error; + + dst->wDataLength = sizeof(dst->Data.PTR); + if (out == DnsCharSetUnicode) dst->wDataLength += + (strlenW( dst->Data.PTR.pNameHost ) + 1) * sizeof(WCHAR); break; } case DNS_TYPE_SIG: @@ -517,6 +535,10 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET dst->Data.SIG.pNameSigner = dns_strcpyX( src->Data.SIG.pNameSigner, in, out ); if (!dst->Data.SIG.pNameSigner) goto error; + + dst->wDataLength = sizeof(dst->Data.SIG); + if (out == DnsCharSetUnicode) dst->wDataLength += + (strlenW( dst->Data.SIG.pNameSigner ) + 1) * sizeof(WCHAR); break; } case DNS_TYPE_SOA: @@ -532,6 +554,11 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET heap_free( dst->Data.SOA.pNamePrimaryServer ); goto error; } + + dst->wDataLength = sizeof(dst->Data.SOA); + if (out == DnsCharSetUnicode) dst->wDataLength += + (strlenW( dst->Data.SOA.pNamePrimaryServer ) + 1) * sizeof(WCHAR) + + (strlenW( dst->Data.SOA.pNameAdministrator ) + 1) * sizeof(WCHAR); break; } case DNS_TYPE_SRV: @@ -539,6 +566,10 @@ PDNS_RECORD WINAPI DnsRecordCopyEx( PDNS_RECORD src, DNS_CHARSET in, DNS_CHARSET dst->Data.SRV.pNameTarget = dns_strcpyX( src->Data.SRV.pNameTarget, in, out ); if (!dst->Data.SRV.pNameTarget) goto error; + + dst->wDataLength = sizeof(dst->Data.SRV); + if (out == DnsCharSetUnicode) dst->wDataLength += + (strlenW( dst->Data.SRV.pNameTarget ) + 1) * sizeof(WCHAR); break; } default: