summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorAntonio Lotti <antonio.lotti@alice.it>2014-12-17 15:55:09 +0100
committerRichard J. Moore <rich@kde.org>2015-02-04 23:08:33 +0000
commitdcedbce99a28a0a07c664ac264820412406a963e (patch)
tree298edb640092cb6c21ae87b41555513715d143f2 /src/network
parent83a3292342f70ba3bdc636c38031c6a1a74646c3 (diff)
Windows : fix call to LookupAccountNameW
The call to LookupAccountNameW from advapi32 was rewritten following the example: http://msdn.microsoft.com/en-us/library/aa392742%28v=vs.85%29.aspx This prevents the generation of a garbage pointer when accessing QWindowsSystemProxy::init() for Qt compiled as 64bit library with MinGW-w64. Task-number: QTBUG-39874 Task-number: QTBUG-38145 Change-Id: I620b2fa64941f84838f9a386851480285336e8d1 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com> Reviewed-by: Richard J. Moore <rich@kde.org>
Diffstat (limited to 'src/network')
-rw-r--r--src/network/kernel/qnetworkproxy_win.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/network/kernel/qnetworkproxy_win.cpp b/src/network/kernel/qnetworkproxy_win.cpp
index da2c020a65..f2176d664d 100644
--- a/src/network/kernel/qnetworkproxy_win.cpp
+++ b/src/network/kernel/qnetworkproxy_win.cpp
@@ -130,10 +130,17 @@ static bool currentProcessIsService()
DWORD size = UNLEN;
if (ptrGetUserName(userName, &size)) {
SID_NAME_USE type = SidTypeUser;
- DWORD dummy = MAX_PATH;
- wchar_t dummyStr[MAX_PATH] = L"";
- PSID psid = 0;
- if (ptrLookupAccountName(NULL, userName, &psid, &dummy, dummyStr, &dummy, &type))
+ DWORD sidSize = 0;
+ DWORD domainSize = 0;
+ // first call is to get the correct size
+ bool bRet = ptrLookupAccountName(NULL, userName, NULL, &sidSize, NULL, &domainSize, &type);
+ if (bRet == FALSE && ERROR_INSUFFICIENT_BUFFER != GetLastError())
+ return false;
+ QVarLengthArray<BYTE, 68> buff(sidSize);
+ QVarLengthArray<wchar_t, MAX_PATH> domainName(domainSize);
+ // second call to LookupAccountNameW actually gets the SID
+ // both the pointer to the buffer and the pointer to the domain name should not be NULL
+ if (ptrLookupAccountName(NULL, userName, buff.data(), &sidSize, domainName.data(), &domainSize, &type))
return type != SidTypeUser; //returns true if the current user is not a user
}
}