out of process fix (#738)
fix an AV in case user give ASPNETCORE_PORT env as we double dereferenced avoid retry and log if the env set invalid port value create jobobject in retry as we delete it in cleanup
This commit is contained in:
parent
df6471f462
commit
3f40f042bc
|
|
@ -30,7 +30,6 @@ SERVER_PROCESS::Initialize(
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo = { 0 };
|
|
||||||
|
|
||||||
m_pProcessManager = pProcessManager;
|
m_pProcessManager = pProcessManager;
|
||||||
m_dwStartupTimeLimitInMS = dwStartupTimeLimitInMS;
|
m_dwStartupTimeLimitInMS = dwStartupTimeLimitInMS;
|
||||||
|
|
@ -47,11 +46,24 @@ SERVER_PROCESS::Initialize(
|
||||||
FAILED(hr = m_struPhysicalPath.Copy(*pszAppPhysicalPath))||
|
FAILED(hr = m_struPhysicalPath.Copy(*pszAppPhysicalPath))||
|
||||||
FAILED(hr = m_struAppFullPath.Copy(*pszAppPath))||
|
FAILED(hr = m_struAppFullPath.Copy(*pszAppPath))||
|
||||||
FAILED(hr = m_struAppVirtualPath.Copy(*pszAppVirtualPath))||
|
FAILED(hr = m_struAppVirtualPath.Copy(*pszAppVirtualPath))||
|
||||||
FAILED(hr = m_Arguments.Copy(*pszArguments)))
|
FAILED(hr = m_Arguments.Copy(*pszArguments)) ||
|
||||||
|
FAILED(hr = SetupJobObject()))
|
||||||
{
|
{
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_pEnvironmentVarTable = pEnvironmentVariables;
|
||||||
|
|
||||||
|
Finished:
|
||||||
|
return hr;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT
|
||||||
|
SERVER_PROCESS::SetupJobObject(VOID)
|
||||||
|
{
|
||||||
|
HRESULT hr = S_OK;
|
||||||
|
JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo = { 0 };
|
||||||
|
|
||||||
if (m_hJobObject == NULL)
|
if (m_hJobObject == NULL)
|
||||||
{
|
{
|
||||||
m_hJobObject = CreateJobObject(NULL, // LPSECURITY_ATTRIBUTES
|
m_hJobObject = CreateJobObject(NULL, // LPSECURITY_ATTRIBUTES
|
||||||
|
|
@ -75,14 +87,10 @@ SERVER_PROCESS::Initialize(
|
||||||
sizeof jobInfo))
|
sizeof jobInfo))
|
||||||
{
|
{
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||||||
goto Finished;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pEnvironmentVarTable = pEnvironmentVariables;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Finished:
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -130,23 +138,25 @@ SERVER_PROCESS::GetRandomPort
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
SERVER_PROCESS::SetupListenPort(
|
SERVER_PROCESS::SetupListenPort(
|
||||||
ENVIRONMENT_VAR_HASH *pEnvironmentVarTable
|
ENVIRONMENT_VAR_HASH *pEnvironmentVarTable,
|
||||||
|
BOOL* pfCriticalError
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HRESULT hr = S_OK;
|
HRESULT hr = S_OK;
|
||||||
ENVIRONMENT_VAR_ENTRY *pEntry = NULL;
|
ENVIRONMENT_VAR_ENTRY *pEntry = NULL;
|
||||||
STACK_STRU(strEventMsg, 256);
|
STACK_STRU(strEventMsg, 256);
|
||||||
|
*pfCriticalError = FALSE;
|
||||||
|
|
||||||
pEnvironmentVarTable->FindKey(ASPNETCORE_PORT_ENV_STR, &pEntry);
|
pEnvironmentVarTable->FindKey(ASPNETCORE_PORT_ENV_STR, &pEntry);
|
||||||
if (pEntry != NULL)
|
if (pEntry != NULL)
|
||||||
{
|
{
|
||||||
pEntry->Dereference();
|
|
||||||
if (pEntry->QueryValue() != NULL || pEntry->QueryValue()[0] != L'\0')
|
if (pEntry->QueryValue() != NULL || pEntry->QueryValue()[0] != L'\0')
|
||||||
{
|
{
|
||||||
m_dwPort = (DWORD)_wtoi(pEntry->QueryValue());
|
m_dwPort = (DWORD)_wtoi(pEntry->QueryValue());
|
||||||
if (m_dwPort >MAX_PORT || m_dwPort < MIN_PORT)
|
if (m_dwPort >MAX_PORT || m_dwPort < MIN_PORT)
|
||||||
{
|
{
|
||||||
hr = E_INVALIDARG;
|
hr = E_INVALIDARG;
|
||||||
|
*pfCriticalError = TRUE;
|
||||||
goto Finished;
|
goto Finished;
|
||||||
// need add log for this one
|
// need add log for this one
|
||||||
}
|
}
|
||||||
|
|
@ -160,6 +170,8 @@ SERVER_PROCESS::SetupListenPort(
|
||||||
//
|
//
|
||||||
pEnvironmentVarTable->DeleteKey(ASPNETCORE_PORT_ENV_STR);
|
pEnvironmentVarTable->DeleteKey(ASPNETCORE_PORT_ENV_STR);
|
||||||
}
|
}
|
||||||
|
pEntry->Dereference();
|
||||||
|
pEntry = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
WCHAR buffer[15];
|
WCHAR buffer[15];
|
||||||
|
|
@ -207,7 +219,7 @@ Finished:
|
||||||
hr)))
|
hr)))
|
||||||
{
|
{
|
||||||
UTILITY::LogEvent(g_hEventLog,
|
UTILITY::LogEvent(g_hEventLog,
|
||||||
EVENTLOG_INFORMATION_TYPE,
|
EVENTLOG_ERROR_TYPE,
|
||||||
ASPNETCORE_EVENT_PROCESS_START_SUCCESS,
|
ASPNETCORE_EVENT_PROCESS_START_SUCCESS,
|
||||||
strEventMsg.QueryStr());
|
strEventMsg.QueryStr());
|
||||||
}
|
}
|
||||||
|
|
@ -736,7 +748,7 @@ SERVER_PROCESS::StartProcess(
|
||||||
MULTISZ mszNewEnvironment;
|
MULTISZ mszNewEnvironment;
|
||||||
ENVIRONMENT_VAR_HASH *pHashTable = NULL;
|
ENVIRONMENT_VAR_HASH *pHashTable = NULL;
|
||||||
PWSTR pStrStage = NULL;
|
PWSTR pStrStage = NULL;
|
||||||
|
BOOL fCriticalError = FALSE;
|
||||||
GetStartupInfoW(&startupInfo);
|
GetStartupInfoW(&startupInfo);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
@ -782,7 +794,7 @@ SERVER_PROCESS::StartProcess(
|
||||||
//
|
//
|
||||||
// setup the the port that the backend process will listen on
|
// setup the the port that the backend process will listen on
|
||||||
//
|
//
|
||||||
if (FAILED(hr = SetupListenPort(pHashTable)))
|
if (FAILED(hr = SetupListenPort(pHashTable, &fCriticalError)))
|
||||||
{
|
{
|
||||||
pStrStage = L"SetupListenPort";
|
pStrStage = L"SetupListenPort";
|
||||||
goto Failure;
|
goto Failure;
|
||||||
|
|
@ -840,6 +852,12 @@ SERVER_PROCESS::StartProcess(
|
||||||
m_hProcessHandle = processInformation.hProcess;
|
m_hProcessHandle = processInformation.hProcess;
|
||||||
m_dwProcessId = processInformation.dwProcessId;
|
m_dwProcessId = processInformation.dwProcessId;
|
||||||
|
|
||||||
|
if (FAILED(hr = SetupJobObject()))
|
||||||
|
{
|
||||||
|
pStrStage = L"SetupJobObject";
|
||||||
|
goto Failure;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_hJobObject != NULL)
|
if (m_hJobObject != NULL)
|
||||||
{
|
{
|
||||||
if (!AssignProcessToJobObject(m_hJobObject, m_hProcessHandle))
|
if (!AssignProcessToJobObject(m_hJobObject, m_hProcessHandle))
|
||||||
|
|
@ -887,6 +905,12 @@ SERVER_PROCESS::StartProcess(
|
||||||
goto Finished;
|
goto Finished;
|
||||||
|
|
||||||
Failure:
|
Failure:
|
||||||
|
if (fCriticalError)
|
||||||
|
{
|
||||||
|
// Critical error, no retry need to avoid wasting resource and polluting log
|
||||||
|
dwRetryCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (SUCCEEDED(strEventMsg.SafeSnwprintf(
|
if (SUCCEEDED(strEventMsg.SafeSnwprintf(
|
||||||
ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG,
|
ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG,
|
||||||
m_struAppFullPath.QueryStr(),
|
m_struAppFullPath.QueryStr(),
|
||||||
|
|
@ -917,7 +941,6 @@ SERVER_PROCESS::StartProcess(
|
||||||
}
|
}
|
||||||
|
|
||||||
CleanUp();
|
CleanUp();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Finished:
|
Finished:
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,11 @@ private:
|
||||||
VOID
|
VOID
|
||||||
CleanUp();
|
CleanUp();
|
||||||
|
|
||||||
|
HRESULT
|
||||||
|
SetupJobObject(
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
BOOL
|
BOOL
|
||||||
IsDebuggerIsAttached(
|
IsDebuggerIsAttached(
|
||||||
VOID
|
VOID
|
||||||
|
|
@ -162,7 +167,8 @@ private:
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
SetupListenPort(
|
SetupListenPort(
|
||||||
ENVIRONMENT_VAR_HASH *pEnvironmentVarTable
|
ENVIRONMENT_VAR_HASH *pEnvironmentVarTable,
|
||||||
|
BOOL *pfCriticalError
|
||||||
);
|
);
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue