Skip to content

Commit 71d0990

Browse files
author
Ivan Zhakov
committed
Fix handle leak in the Win32 apr_uid_current implementation.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1860057 13f79535-47bb-0310-9956-ffa450edef68
1 parent be9c920 commit 71d0990

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

CHANGES

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
-*- coding: utf-8 -*-
22
Changes for APR 2.0.0
33

4+
*) Fix handle leak in the Win32 apr_uid_current implementation.
5+
PR 61165. [Ivan Zhakov]
6+
47
*) apr_rwlock_t: Use native Slim Reader/Writer (SRW) locks on Windows.
58
PR 51360. [Ivan Zhakov]
69

user/win32/userinfo.c

+19-8
Original file line numberDiff line numberDiff line change
@@ -171,27 +171,38 @@ APR_DECLARE(apr_status_t) apr_uid_current(apr_uid_t *uid,
171171
DWORD needed;
172172
TOKEN_USER *usr;
173173
TOKEN_PRIMARY_GROUP *grp;
174-
174+
apr_status_t rv;
175+
175176
if(!OpenProcessToken(GetCurrentProcess(), STANDARD_RIGHTS_READ | READ_CONTROL | TOKEN_QUERY, &threadtok)) {
176177
return apr_get_os_error();
177178
}
178179

179180
*uid = NULL;
180181
if (!GetTokenInformation(threadtok, TokenUser, NULL, 0, &needed)
181-
&& (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
182+
&& (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
182183
&& (usr = apr_palloc(p, needed))
183-
&& GetTokenInformation(threadtok, TokenUser, usr, needed, &needed))
184+
&& GetTokenInformation(threadtok, TokenUser, usr, needed, &needed)) {
184185
*uid = usr->User.Sid;
185-
else
186-
return apr_get_os_error();
186+
}
187+
else {
188+
rv = apr_get_os_error();
189+
CloseHandle(threadtok);
190+
return rv;
191+
}
187192

188193
if (!GetTokenInformation(threadtok, TokenPrimaryGroup, NULL, 0, &needed)
189194
&& (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
190195
&& (grp = apr_palloc(p, needed))
191-
&& GetTokenInformation(threadtok, TokenPrimaryGroup, grp, needed, &needed))
196+
&& GetTokenInformation(threadtok, TokenPrimaryGroup, grp, needed, &needed)) {
192197
*gid = grp->PrimaryGroup;
193-
else
194-
return apr_get_os_error();
198+
}
199+
else {
200+
rv = apr_get_os_error();
201+
CloseHandle(threadtok);
202+
return rv;
203+
}
204+
205+
CloseHandle(threadtok);
195206

196207
return APR_SUCCESS;
197208
#endif

0 commit comments

Comments
 (0)