Fix two string allocation issues (#1539)
This commit is contained in:
parent
25fab09527
commit
ffa72f5a0c
|
|
@ -63,13 +63,15 @@ private:
|
||||||
{
|
{
|
||||||
HRSRC rc = nullptr;
|
HRSRC rc = nullptr;
|
||||||
HGLOBAL rcData = nullptr;
|
HGLOBAL rcData = nullptr;
|
||||||
const char* data = nullptr;
|
std::string data;
|
||||||
|
const char* pTempData = nullptr;
|
||||||
|
|
||||||
THROW_LAST_ERROR_IF_NULL(rc = FindResource(module, MAKEINTRESOURCE(page), RT_HTML));
|
THROW_LAST_ERROR_IF_NULL(rc = FindResource(module, MAKEINTRESOURCE(page), RT_HTML));
|
||||||
THROW_LAST_ERROR_IF_NULL(rcData = LoadResource(module, rc));
|
THROW_LAST_ERROR_IF_NULL(rcData = LoadResource(module, rc));
|
||||||
auto const size = SizeofResource(module, rc);
|
auto const size = SizeofResource(module, rc);
|
||||||
THROW_LAST_ERROR_IF(size == 0);
|
THROW_LAST_ERROR_IF(size == 0);
|
||||||
THROW_LAST_ERROR_IF_NULL(data = static_cast<const char*>(LockResource(rcData)));
|
THROW_LAST_ERROR_IF_NULL(pTempData = static_cast<const char*>(LockResource(rcData)));
|
||||||
|
data = std::string(pTempData, size);
|
||||||
|
|
||||||
auto additionalErrorLink = Environment::GetEnvironmentVariableValue(L"ANCM_ADDITIONAL_ERROR_PAGE_LINK");
|
auto additionalErrorLink = Environment::GetEnvironmentVariableValue(L"ANCM_ADDITIONAL_ERROR_PAGE_LINK");
|
||||||
std::string additionalHtml;
|
std::string additionalHtml;
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,8 @@ std::wstring format(const std::wstring& format, Args ... args)
|
||||||
if (!format.empty())
|
if (!format.empty())
|
||||||
{
|
{
|
||||||
const size_t size = swprintf(nullptr, 0, format.c_str(), args ...); // Extra char for '\0'
|
const size_t size = swprintf(nullptr, 0, format.c_str(), args ...); // Extra char for '\0'
|
||||||
result.resize(size + 1);
|
result.resize(size);
|
||||||
if (swprintf(result.data(), result.size(), format.c_str(), args ... ) == -1)
|
if (swprintf(result.data(), result.size() + 1, format.c_str(), args ... ) == -1)
|
||||||
{
|
{
|
||||||
throw std::system_error(std::error_code(errno, std::system_category()));
|
throw std::system_error(std::error_code(errno, std::system_category()));
|
||||||
}
|
}
|
||||||
|
|
@ -39,8 +39,8 @@ std::string format(const std::string& format, Args ... args)
|
||||||
if (!format.empty())
|
if (!format.empty())
|
||||||
{
|
{
|
||||||
const size_t size = snprintf(nullptr, 0, format.c_str(), args ...); // Extra char for '\0'
|
const size_t size = snprintf(nullptr, 0, format.c_str(), args ...); // Extra char for '\0'
|
||||||
result.resize(size + 1);
|
result.resize(size);
|
||||||
if (snprintf(result.data(), result.size(), format.c_str(), args ... ) == -1)
|
if (snprintf(result.data(), result.size() + 1, format.c_str(), args ... ) == -1)
|
||||||
{
|
{
|
||||||
throw std::system_error(std::error_code(errno, std::system_category()));
|
throw std::system_error(std::error_code(errno, std::system_category()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
|
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
|
||||||
public async Task IncludesAdditionalErrorPageTextInProcessHandlerLoadFailure()
|
public async Task IncludesAdditionalErrorPageTextInProcessHandlerLoadFailure_CorrectString()
|
||||||
{
|
{
|
||||||
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
var response = await DeployAppWithStartupFailure(deploymentParameters);
|
var response = await DeployAppWithStartupFailure(deploymentParameters);
|
||||||
|
|
@ -33,13 +33,16 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
StopServer();
|
StopServer();
|
||||||
|
|
||||||
Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", await response.Content.ReadAsStringAsync());
|
var responseString = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", responseString);
|
||||||
|
VerifyNoExtraTrailingBytes(responseString);
|
||||||
|
|
||||||
await AssertLink(response);
|
await AssertLink(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
|
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
|
||||||
public async Task IncludesAdditionalErrorPageTextOutOfProcessStartupFailure()
|
public async Task IncludesAdditionalErrorPageTextOutOfProcessStartupFailure_CorrectString()
|
||||||
{
|
{
|
||||||
var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
|
||||||
var response = await DeployAppWithStartupFailure(deploymentParameters);
|
var response = await DeployAppWithStartupFailure(deploymentParameters);
|
||||||
|
|
@ -48,13 +51,16 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
StopServer();
|
StopServer();
|
||||||
|
|
||||||
Assert.Contains("HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure", await response.Content.ReadAsStringAsync());
|
var responseString = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Contains("HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure", responseString);
|
||||||
|
VerifyNoExtraTrailingBytes(responseString);
|
||||||
|
|
||||||
await AssertLink(response);
|
await AssertLink(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
|
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
|
||||||
public async Task IncludesAdditionalErrorPageTextOutOfProcessHandlerLoadFailure()
|
public async Task IncludesAdditionalErrorPageTextOutOfProcessHandlerLoadFailure_CorrectString()
|
||||||
{
|
{
|
||||||
var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true);
|
||||||
deploymentParameters.HandlerSettings["handlerVersion"] = "88.93";
|
deploymentParameters.HandlerSettings["handlerVersion"] = "88.93";
|
||||||
|
|
@ -67,13 +73,16 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
StopServer();
|
StopServer();
|
||||||
|
|
||||||
Assert.Contains("HTTP Error 500.0 - ANCM Out-Of-Process Handler Load Failure", await response.Content.ReadAsStringAsync());
|
var responseString = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Contains("HTTP Error 500.0 - ANCM Out-Of-Process Handler Load Failure", responseString);
|
||||||
|
VerifyNoExtraTrailingBytes(responseString);
|
||||||
|
|
||||||
await AssertLink(response);
|
await AssertLink(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
[ConditionalFact]
|
[ConditionalFact]
|
||||||
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
|
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
|
||||||
public async Task IncludesAdditionalErrorPageTextInProcessStartupFailure()
|
public async Task IncludesAdditionalErrorPageTextInProcessStartupFailure_CorrectString()
|
||||||
{
|
{
|
||||||
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true);
|
||||||
deploymentParameters.TransformArguments((a, _) => $"{a} EarlyReturn");
|
deploymentParameters.TransformArguments((a, _) => $"{a} EarlyReturn");
|
||||||
|
|
@ -86,10 +95,21 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
|
||||||
StopServer();
|
StopServer();
|
||||||
|
|
||||||
Assert.Contains("HTTP Error 500.30 - ANCM In-Process Start Failure", await response.Content.ReadAsStringAsync());
|
var responseString = await response.Content.ReadAsStringAsync();
|
||||||
|
Assert.Contains("HTTP Error 500.30 - ANCM In-Process Start Failure", responseString);
|
||||||
|
VerifyNoExtraTrailingBytes(responseString);
|
||||||
|
|
||||||
await AssertLink(response);
|
await AssertLink(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void VerifyNoExtraTrailingBytes(string responseString)
|
||||||
|
{
|
||||||
|
if (!DeployerSelector.IsBackwardsCompatiblityTest)
|
||||||
|
{
|
||||||
|
Assert.EndsWith("</html>\r\n", responseString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static async Task AssertLink(HttpResponseMessage response)
|
private static async Task AssertLink(HttpResponseMessage response)
|
||||||
{
|
{
|
||||||
Assert.Contains("<a href=\"http://example\"> <cite> http://example </cite></a> and ", await response.Content.ReadAsStringAsync());
|
Assert.Contains("<a href=\"http://example\"> <cite> http://example </cite></a> and ", await response.Content.ReadAsStringAsync());
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "Environment.h"
|
#include "Environment.h"
|
||||||
|
#include "StringHelpers.h"
|
||||||
|
|
||||||
TEST(PassUnexpandedEnvString, ExpandsResult)
|
TEST(PassUnexpandedEnvString, ExpandsResult)
|
||||||
{
|
{
|
||||||
|
|
@ -58,3 +59,17 @@ TEST(GetEnvironmentVariableValue, ReturnsNulloptWhenNotFound)
|
||||||
auto result = Environment::GetEnvironmentVariableValue(L"RANDOM_ENV_VAR_2");
|
auto result = Environment::GetEnvironmentVariableValue(L"RANDOM_ENV_VAR_2");
|
||||||
EXPECT_FALSE(result.has_value());
|
EXPECT_FALSE(result.has_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(CheckStringHelpers, FormatWithoutContentDoesNotIncreaseSizeString)
|
||||||
|
{
|
||||||
|
std::string testString = "test";
|
||||||
|
auto result = format(testString);
|
||||||
|
EXPECT_EQ(testString.size(), result.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(CheckStringHelpers, FormatWithoutContentDoesNotIncreaseSizeWstring)
|
||||||
|
{
|
||||||
|
std::wstring testString = L"test";
|
||||||
|
auto result = format(testString);
|
||||||
|
EXPECT_EQ(testString.size(), result.size());
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,5 +8,6 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
public static class DeployerSelector
|
public static class DeployerSelector
|
||||||
{
|
{
|
||||||
public static ServerType ServerType => ServerType.IIS;
|
public static ServerType ServerType => ServerType.IIS;
|
||||||
|
public static bool IsBackwardsCompatiblityTest => true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
// Copyright (c) .NET Foundation. All rights reserved.
|
||||||
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using Microsoft.AspNetCore.Server.IntegrationTesting;
|
||||||
|
|
||||||
|
namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
|
{
|
||||||
|
public static class DeployerSelector
|
||||||
|
{
|
||||||
|
public static ServerType ServerType => ServerType.IIS;
|
||||||
|
public static bool IsBackwardsCompatiblityTest => false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,5 +8,6 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests
|
||||||
public static class DeployerSelector
|
public static class DeployerSelector
|
||||||
{
|
{
|
||||||
public static ServerType ServerType => ServerType.IISExpress;
|
public static ServerType ServerType => ServerType.IISExpress;
|
||||||
|
public static bool IsBackwardsCompatiblityTest => false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue