summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorcomex <comexk@gmail.com>2023-06-26 02:00:05 +0200
committercomex <comexk@gmail.com>2023-06-26 02:06:57 +0200
commitac939f08a4c116b6a38978358b667b1fa0c51ef9 (patch)
treed056a56751a46f31b2b4f8e2d7b0de31fc5de1db /src
parentssl: fix compatibility with OpenSSL 1.1.1 (diff)
downloadyuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar
yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.gz
yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.bz2
yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.lz
yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.xz
yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.tar.zst
yuzu-ac939f08a4c116b6a38978358b667b1fa0c51ef9.zip
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt2
-rw-r--r--src/core/hle/service/sockets/sfdnsres.cpp4
-rw-r--r--src/core/hle/service/ssl/ssl_backend_schannel.cpp49
-rw-r--r--src/core/internal_network/network.cpp4
-rw-r--r--src/core/internal_network/network.h4
5 files changed, 35 insertions, 28 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index d95d2fe01..4c53aed72 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -872,7 +872,7 @@ if(ENABLE_OPENSSL)
elseif (WIN32)
target_sources(core PRIVATE
hle/service/ssl/ssl_backend_schannel.cpp)
- target_link_libraries(core PRIVATE Secur32)
+ target_link_libraries(core PRIVATE secur32)
else()
target_sources(core PRIVATE
hle/service/ssl/ssl_backend_none.cpp)
diff --git a/src/core/hle/service/sockets/sfdnsres.cpp b/src/core/hle/service/sockets/sfdnsres.cpp
index fb8798b42..c5eaec920 100644
--- a/src/core/hle/service/sockets/sfdnsres.cpp
+++ b/src/core/hle/service/sockets/sfdnsres.cpp
@@ -149,7 +149,7 @@ static std::pair<u32, GetAddrInfoError> GetHostByNameRequestImpl(HLERequestConte
const std::string host = Common::StringFromBuffer(host_buffer);
// For now, ignore options, which are in input buffer 1 for GetHostByNameRequestWithOptions.
- auto res = Network::GetAddrInfo(host, /*service*/ std::nullopt);
+ auto res = Network::GetAddressInfo(host, /*service*/ std::nullopt);
if (!res.has_value()) {
return {0, Translate(res.error())};
}
@@ -249,7 +249,7 @@ static std::pair<u32, GetAddrInfoError> GetAddrInfoRequestImpl(HLERequestContext
// Serialized hints are also passed in a buffer, but are ignored for now.
- auto res = Network::GetAddrInfo(host, service);
+ auto res = Network::GetAddressInfo(host, service);
if (!res.has_value()) {
return {0, Translate(res.error())};
}
diff --git a/src/core/hle/service/ssl/ssl_backend_schannel.cpp b/src/core/hle/service/ssl/ssl_backend_schannel.cpp
index 0a326b536..92b2dddaa 100644
--- a/src/core/hle/service/ssl/ssl_backend_schannel.cpp
+++ b/src/core/hle/service/ssl/ssl_backend_schannel.cpp
@@ -12,29 +12,31 @@
#include <mutex>
+namespace {
+
+// These includes are inside the namespace to avoid a conflict on MinGW where
+// the headers define an enum containing Network and Service as enumerators
+// (which clash with the correspondingly named namespaces).
#define SECURITY_WIN32
-#include <Security.h>
+#include <security.h>
#include <schnlsp.h>
-namespace {
-
std::once_flag one_time_init_flag;
bool one_time_init_success = false;
-SCHANNEL_CRED schannel_cred{
- .dwVersion = SCHANNEL_CRED_VERSION,
- .dwFlags = SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols
- SCH_CRED_AUTO_CRED_VALIDATION | // validate certs
- SCH_CRED_NO_DEFAULT_CREDS, // don't automatically present a client certificate
+SCHANNEL_CRED schannel_cred{};
+CredHandle cred_handle;
+
+static void OneTimeInit() {
+ schannel_cred.dwVersion = SCHANNEL_CRED_VERSION;
+ schannel_cred.dwFlags = SCH_USE_STRONG_CRYPTO | // don't allow insecure protocols
+ SCH_CRED_AUTO_CRED_VALIDATION | // validate certs
+ SCH_CRED_NO_DEFAULT_CREDS; // don't automatically present a client certificate
// ^ I'm assuming that nobody would want to connect Yuzu to a
// service that requires some OS-provided corporate client
// certificate, and presenting one to some arbitrary server
// might be a privacy concern? Who knows, though.
-};
-
-CredHandle cred_handle;
-static void OneTimeInit() {
SECURITY_STATUS ret =
AcquireCredentialsHandle(nullptr, const_cast<LPTSTR>(UNISP_NAME), SECPKG_CRED_OUTBOUND,
nullptr, &schannel_cred, nullptr, nullptr, &cred_handle, nullptr);
@@ -179,15 +181,21 @@ public:
// [1] (will be replaced by SECBUFFER_MISSING when SEC_E_INCOMPLETE_MESSAGE is
// returned, or SECBUFFER_EXTRA when SEC_E_CONTINUE_NEEDED is returned if the
// whole buffer wasn't used)
+ .cbBuffer = 0,
.BufferType = SECBUFFER_EMPTY,
+ .pvBuffer = nullptr,
},
}};
std::array<SecBuffer, 2> output_buffers{{
{
+ .cbBuffer = 0,
.BufferType = SECBUFFER_TOKEN,
+ .pvBuffer = nullptr,
}, // [0]
{
+ .cbBuffer = 0,
.BufferType = SECBUFFER_ALERT,
+ .pvBuffer = nullptr,
}, // [1]
}};
SecBufferDesc input_desc{
@@ -299,21 +307,20 @@ public:
return read_size;
}
if (!ciphertext_read_buf_.empty()) {
+ SecBuffer empty{
+ .cbBuffer = 0,
+ .BufferType = SECBUFFER_EMPTY,
+ .pvBuffer = nullptr,
+ };
std::array<SecBuffer, 5> buffers{{
{
.cbBuffer = static_cast<unsigned long>(ciphertext_read_buf_.size()),
.BufferType = SECBUFFER_DATA,
.pvBuffer = ciphertext_read_buf_.data(),
},
- {
- .BufferType = SECBUFFER_EMPTY,
- },
- {
- .BufferType = SECBUFFER_EMPTY,
- },
- {
- .BufferType = SECBUFFER_EMPTY,
- },
+ empty,
+ empty,
+ empty,
}};
ASSERT_OR_EXECUTE_MSG(
buffers[0].cbBuffer == ciphertext_read_buf_.size(),
diff --git a/src/core/internal_network/network.cpp b/src/core/internal_network/network.cpp
index 0164d12eb..40e451526 100644
--- a/src/core/internal_network/network.cpp
+++ b/src/core/internal_network/network.cpp
@@ -493,9 +493,7 @@ u32 IPv4AddressToInteger(IPv4Address ip_addr) {
static_cast<u32>(ip_addr[2]) << 8 | static_cast<u32>(ip_addr[3]);
}
-#undef GetAddrInfo // Windows defines it as a macro
-
-Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddrInfo(
+Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo(
const std::string& host, const std::optional<std::string>& service) {
addrinfo hints{};
hints.ai_family = AF_INET; // Switch only supports IPv4.
diff --git a/src/core/internal_network/network.h b/src/core/internal_network/network.h
index 96319bfc8..badcb8369 100644
--- a/src/core/internal_network/network.h
+++ b/src/core/internal_network/network.h
@@ -5,6 +5,7 @@
#include <array>
#include <optional>
+#include <vector>
#include "common/common_funcs.h"
#include "common/common_types.h"
@@ -113,7 +114,8 @@ std::optional<IPv4Address> GetHostIPv4Address();
std::string IPv4AddressToString(IPv4Address ip_addr);
u32 IPv4AddressToInteger(IPv4Address ip_addr);
-Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddrInfo(
+// named to avoid name collision with Windows macro
+Common::Expected<std::vector<AddrInfo>, GetAddrInfoError> GetAddressInfo(
const std::string& host, const std::optional<std::string>& service);
} // namespace Network