Merge pull request #162 from selvanair/close-handles

-Close token handle in GetProcessTokenGroups()
-Close open service handles after use
-Close registry keys after use

Acked-by: Gert Doering <gert@greenie.muc.de>
pull/141/merge
Selva Nair 2017-05-14 14:09:07 -04:00 committed by GitHub
commit 3c2e87c9b2
3 changed files with 67 additions and 33 deletions

View File

@ -324,7 +324,7 @@ GetProcessTokenGroups(void)
if (!groups) if (!groups)
{ {
PrintDebug(L"GetProcessTokenGroups: error = %lu", GetLastError()); PrintDebug(L"GetProcessTokenGroups: error = %lu", GetLastError());
return NULL; goto out;
} }
if (!GetTokenInformation(token, TokenGroups, groups, buf_size, &buf_size)) if (!GetTokenInformation(token, TokenGroups, groups, buf_size, &buf_size))
{ {
@ -332,6 +332,9 @@ GetProcessTokenGroups(void)
free (groups); free (groups);
groups = NULL; groups = NULL;
} }
out:
CloseHandle(token);
return groups; return groups;
} }

View File

@ -174,7 +174,7 @@ GetRegistryKeys ()
PrintDebug(L"from registry: %s = %lu", regkey_int[i].name, *regkey_int[i].var); PrintDebug(L"from registry: %s = %lu", regkey_int[i].name, *regkey_int[i].var);
} }
if ( status != ERROR_SUCCESS) if ( status == ERROR_SUCCESS)
RegCloseKey (regkey); RegCloseKey (regkey);
if ((o.disconnectscript_timeout == 0)) if ((o.disconnectscript_timeout == 0))
@ -198,13 +198,14 @@ SaveRegistryKeys ()
HKEY regkey; HKEY regkey;
DWORD status; DWORD status;
int i; int i;
int ret = false;
status = RegCreateKeyEx(HKEY_CURRENT_USER, GUI_REGKEY_HKCU, 0, NULL, REG_OPTION_NON_VOLATILE, status = RegCreateKeyEx(HKEY_CURRENT_USER, GUI_REGKEY_HKCU, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_WRITE|KEY_READ, NULL, &regkey, NULL); KEY_WRITE|KEY_READ, NULL, &regkey, NULL);
if (status != ERROR_SUCCESS) if (status != ERROR_SUCCESS)
{ {
ShowLocalizedMsg (IDS_ERR_CREATE_REG_HKCU_KEY, GUI_REGKEY_HKCU); ShowLocalizedMsg (IDS_ERR_CREATE_REG_HKCU_KEY, GUI_REGKEY_HKCU);
return false; goto out;
} }
for (i = 0 ; i < (int) _countof (regkey_str); ++i) for (i = 0 ; i < (int) _countof (regkey_str); ++i)
{ {
@ -213,7 +214,7 @@ SaveRegistryKeys ()
RegValueExists(regkey, regkey_str[i].name) ) RegValueExists(regkey, regkey_str[i].name) )
{ {
if (!SetRegistryValue (regkey, regkey_str[i].name, regkey_str[i].var)) if (!SetRegistryValue (regkey, regkey_str[i].name, regkey_str[i].var))
return false; goto out;
} }
} }
@ -223,13 +224,16 @@ SaveRegistryKeys ()
RegValueExists(regkey, regkey_int[i].name) ) RegValueExists(regkey, regkey_int[i].name) )
{ {
if (!SetRegistryValueNumeric (regkey, regkey_int[i].name, *regkey_int[i].var)) if (!SetRegistryValueNumeric (regkey, regkey_int[i].name, *regkey_int[i].var))
return false; goto out;
} }
} }
ret = true;
RegCloseKey (regkey); out:
return true; if (status == ERROR_SUCCESS)
RegCloseKey(regkey);
return ret;
} }
static BOOL static BOOL
@ -260,8 +264,8 @@ SetRegistryVersion (const version_t *v)
KEY_WRITE, NULL, &regkey, NULL); KEY_WRITE, NULL, &regkey, NULL);
if (status == ERROR_SUCCESS) if (status == ERROR_SUCCESS)
{ {
ret = (RegSetValueEx(regkey, L"version", 0, REG_BINARY, (const BYTE*) v, sizeof(*v)) if (RegSetValueEx(regkey, L"version", 0, REG_BINARY, (const BYTE*) v, sizeof(*v)) == ERROR_SUCCESS)
!= ERROR_SUCCESS); ret = true;
RegCloseKey(regkey); RegCloseKey(regkey);
} }
else else

View File

@ -40,8 +40,8 @@ extern options_t o;
int MyStartService() int MyStartService()
{ {
SC_HANDLE schSCManager; SC_HANDLE schSCManager = NULL;
SC_HANDLE schService; SC_HANDLE schService = NULL;
SERVICE_STATUS ssStatus; SERVICE_STATUS ssStatus;
DWORD dwOldCheckPoint; DWORD dwOldCheckPoint;
DWORD dwStartTickCount; DWORD dwStartTickCount;
@ -145,9 +145,6 @@ int MyStartService()
} }
} }
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
if (ssStatus.dwCurrentState != SERVICE_RUNNING) if (ssStatus.dwCurrentState != SERVICE_RUNNING)
{ {
/* service hasn't started */ /* service hasn't started */
@ -167,10 +164,15 @@ int MyStartService()
/* Show "OpenVPN Service Started" Tray Balloon msg */ /* Show "OpenVPN Service Started" Tray Balloon msg */
ShowTrayBalloon(LoadLocalizedString(IDS_NFO_SERVICE_STARTED), _T("")); ShowTrayBalloon(LoadLocalizedString(IDS_NFO_SERVICE_STARTED), _T(""));
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
return(true); return(true);
failed: failed:
if (schService)
CloseServiceHandle(schService);
if (schSCManager)
CloseServiceHandle(schSCManager);
/* Set Service Status = Disconnecting */ /* Set Service Status = Disconnecting */
o.service_state = service_disconnected; o.service_state = service_disconnected;
SetServiceMenuStatus(); SetServiceMenuStatus();
@ -181,10 +183,11 @@ failed:
int MyStopService() int MyStopService()
{ {
SC_HANDLE schSCManager; SC_HANDLE schSCManager = NULL;
SC_HANDLE schService; SC_HANDLE schService = NULL;
SERVICE_STATUS ssStatus; SERVICE_STATUS ssStatus;
int i; int i;
BOOL ret = false;
// Open a handle to the SC Manager database. // Open a handle to the SC Manager database.
schSCManager = OpenSCManager( schSCManager = OpenSCManager(
@ -206,7 +209,7 @@ int MyStopService()
if (schService == NULL) { if (schService == NULL) {
/* can't open vpn service */ /* can't open vpn service */
ShowLocalizedMsg(IDS_ERR_OPEN_VPN_SERVICE); ShowLocalizedMsg(IDS_ERR_OPEN_VPN_SERVICE);
return(false); goto out;
} }
/* Run DisConnect script */ /* Run DisConnect script */
@ -220,13 +223,20 @@ int MyStopService()
{ {
/* stop failed */ /* stop failed */
ShowLocalizedMsg(IDS_ERR_STOP_SERVICE); ShowLocalizedMsg(IDS_ERR_STOP_SERVICE);
return(false); goto out;
} }
o.service_state = service_disconnected; o.service_state = service_disconnected;
SetServiceMenuStatus(); SetServiceMenuStatus();
CheckAndSetTrayIcon(); CheckAndSetTrayIcon();
return(true); ret = true;
out:
if (schService)
CloseServiceHandle(schService);
if (schSCManager)
CloseServiceHandle(schSCManager);
return ret;
} }
int MyReStartService() int MyReStartService()
@ -244,9 +254,10 @@ int MyReStartService()
bool bool
CheckIServiceStatus(BOOL warn) CheckIServiceStatus(BOOL warn)
{ {
SC_HANDLE schSCManager; SC_HANDLE schSCManager = NULL;
SC_HANDLE schService; SC_HANDLE schService = NULL;
SERVICE_STATUS ssStatus; SERVICE_STATUS ssStatus;
BOOL ret = false;
// Open a handle to the SC Manager database. // Open a handle to the SC Manager database.
schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
@ -262,28 +273,36 @@ CheckIServiceStatus(BOOL warn)
/* warn that iservice is not installed */ /* warn that iservice is not installed */
if (warn) if (warn)
ShowLocalizedMsg(IDS_ERR_INSTALL_ISERVICE); ShowLocalizedMsg(IDS_ERR_INSTALL_ISERVICE);
return(false); goto out;
} }
if (!QueryServiceStatus(schService, &ssStatus)) if (!QueryServiceStatus(schService, &ssStatus))
return(false); goto out;
if (ssStatus.dwCurrentState != SERVICE_RUNNING) if (ssStatus.dwCurrentState != SERVICE_RUNNING)
{ {
/* warn that iservice is not started */ /* warn that iservice is not started */
if (warn) if (warn)
ShowLocalizedMsg(IDS_ERR_NOTSTARTED_ISERVICE); ShowLocalizedMsg(IDS_ERR_NOTSTARTED_ISERVICE);
return(false); goto out;
} }
return true; ret = true;
out:
if (schService)
CloseServiceHandle(schService);
if (schSCManager)
CloseServiceHandle(schSCManager);
return ret;
} }
int CheckServiceStatus() int CheckServiceStatus()
{ {
SC_HANDLE schSCManager; SC_HANDLE schSCManager = NULL;
SC_HANDLE schService; SC_HANDLE schService = NULL;
SERVICE_STATUS ssStatus; SERVICE_STATUS ssStatus;
BOOL ret = false;
// Open a handle to the SC Manager database. // Open a handle to the SC Manager database.
schSCManager = OpenSCManager( schSCManager = OpenSCManager(
@ -294,7 +313,7 @@ int CheckServiceStatus()
if (NULL == schSCManager) { if (NULL == schSCManager) {
o.service_state = service_noaccess; o.service_state = service_noaccess;
SetServiceMenuStatus(); SetServiceMenuStatus();
return(false); goto out;
} }
schService = OpenService( schService = OpenService(
@ -307,7 +326,7 @@ int CheckServiceStatus()
ShowLocalizedMsg(IDS_ERR_OPEN_VPN_SERVICE); ShowLocalizedMsg(IDS_ERR_OPEN_VPN_SERVICE);
o.service_state = service_noaccess; o.service_state = service_noaccess;
SetServiceMenuStatus(); SetServiceMenuStatus();
return(false); goto out;
} }
if (!QueryServiceStatus( if (!QueryServiceStatus(
@ -316,7 +335,7 @@ int CheckServiceStatus()
{ {
/* query failed */ /* query failed */
ShowLocalizedMsg(IDS_ERR_QUERY_SERVICE); ShowLocalizedMsg(IDS_ERR_QUERY_SERVICE);
return(false); goto out;
} }
if (ssStatus.dwCurrentState == SERVICE_RUNNING) if (ssStatus.dwCurrentState == SERVICE_RUNNING)
@ -324,13 +343,21 @@ int CheckServiceStatus()
o.service_state = service_connected; o.service_state = service_connected;
SetServiceMenuStatus(); SetServiceMenuStatus();
SetTrayIcon(connected); SetTrayIcon(connected);
return(true); ret = true;
goto out;
} }
else else
{ {
o.service_state = service_disconnected; o.service_state = service_disconnected;
SetServiceMenuStatus(); SetServiceMenuStatus();
SetTrayIcon(disconnected); SetTrayIcon(disconnected);
return(false); goto out;
} }
out:
if (schService)
CloseServiceHandle(schService);
if (schSCManager)
CloseServiceHandle(schSCManager);
return ret;
} }