Просмотр исходного кода

Fix more Windows build errors

I did test this beforehand, but not on MinGW, and the error that showed
up on the msvc builder didn't happen for me...
comex 3 лет назад
Родитель
Сommit
ac939f08a4

+ 1 - 1
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)

+ 2 - 2
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())};
     }

+ 28 - 21
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(),

+ 1 - 3
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.

+ 3 - 1
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