From 33587e97573829b17f529bbdd180976dcd9a7e93 Mon Sep 17 00:00:00 2001 From: Pavel Solodovnikov Date: Mon, 21 Apr 2025 12:06:22 +0300 Subject: [PATCH 1/3] TraceLoggingProvider: Disable for MinGW builds There are no `TraceLoggerProvider.h` or `winmeta.h` headers in MinGW w32api package, so just disable the support for TraceLoggerProvider interfaces. Signed-off-by: Pavel Solodovnikov --- src/public/tier0/valve_tracelogging.h | 8 +++++++- .../clientlib/steamnetworkingsockets_lowlevel.cpp | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/public/tier0/valve_tracelogging.h b/src/public/tier0/valve_tracelogging.h index bf1d5d9c..aec3194c 100644 --- a/src/public/tier0/valve_tracelogging.h +++ b/src/public/tier0/valve_tracelogging.h @@ -82,7 +82,13 @@ #include //#include //#include - #include + + // TraceLoggingProvider-related header files are not available in MinGW builds, so disable it. + #if defined(_WIN32) && (defined(__MINGW32__) || defined(__MINGW64__)) + #define VALVE_DISABLE_TRACELOGGING + #else + #include + #endif #ifdef VALVE_DISABLE_TRACELOGGING #define IsTraceLoggingEnabled() false diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp index 951f51dc..74dc082d 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp @@ -78,6 +78,7 @@ namespace SteamNetworkingSocketsLib { inline void ETW_LongOp( const char *opName, SteamNetworkingMicroseconds usec, const char *pszInfo ) { +#if IsTraceLoggingEnabled() if ( !pszInfo ) pszInfo = ""; TraceLoggingWrite( @@ -87,6 +88,11 @@ inline void ETW_LongOp( const char *opName, SteamNetworkingMicroseconds usec, co TraceLoggingUInt64( usec, "Microseconds" ), TraceLoggingString( pszInfo, "ExtraInfo" ) ); +#else + (void)opName; + (void)usec; + (void)pszInfo; +#endif } constexpr int k_msMaxPollWait = 1000; @@ -4513,6 +4519,7 @@ STEAMNETWORKINGSOCKETS_INTERFACE void SteamNetworkingSockets_DefaultPreFormatDeb // Gah, some, but not all, of our code has newlines on the end V_StripTrailingWhitespaceASCII( buf ); +#if IsTraceLoggingEnabled() // Emit an ETW event. Unfortunately, TraceLoggingLevel requires a constant argument if ( IsTraceLoggingProviderEnabled( HTraceLogging_SteamNetworkingSockets ) ) { @@ -4553,6 +4560,7 @@ STEAMNETWORKINGSOCKETS_INTERFACE void SteamNetworkingSockets_DefaultPreFormatDeb ); } } +#endif // IsTraceLoggingEnabled() // Spew to log file? #ifdef STEAMNETWORKINGSOCKETS_ENABLE_SYSTEMSPEW From 6223714e1c5b159093c48a31d55cf2c5e3db15fb Mon Sep 17 00:00:00 2001 From: Pavel Solodovnikov Date: Mon, 21 Apr 2025 15:43:43 +0300 Subject: [PATCH 2/3] build: Fix compilation errors for `cmsghdr`-related things in MinGW builds Signed-off-by: Pavel Solodovnikov --- .../clientlib/steamnetworkingsockets_lowlevel.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp index 74dc082d..d31f7c68 100644 --- a/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp +++ b/src/steamnetworkingsockets/clientlib/steamnetworkingsockets_lowlevel.cpp @@ -74,6 +74,15 @@ TRACELOGGING_DEFINE_PROVIDER( constexpr int k_cbETWEventUDPPacketDataSize = 16; #endif +#if defined(_WIN32) && (defined(__MINGW32__) || defined(__MINGW64__)) + // This one contains `_WSACMSGHDR` and friends in MinGW case (as opposed to `ws2def.h` for ordinary windows builds) + #include + #define cmsghdr WSACMSGHDR + #define CMSGHDR WSACMSGHDR + #define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR + #define CMSG_NXTHDR WSA_CMSG_NXTHDR +#endif + namespace SteamNetworkingSocketsLib { inline void ETW_LongOp( const char *opName, SteamNetworkingMicroseconds usec, const char *pszInfo ) From 5a7c2dd4825e325513d5e5c451334683a03714fe Mon Sep 17 00:00:00 2001 From: Pavel Solodovnikov Date: Sun, 16 Mar 2025 19:38:30 +0300 Subject: [PATCH 3/3] SteamNetworkingIPAddr: fix potentially dangerous `-wcast-align` warning in `IsIPv6AllZeroes()` C-style cast from `uint8*` to `uint64*` is unsafe and can blow up in cases when the source pointer is not aligned to `uint64` type requirements. Signed-off-by: Pavel Solodovnikov --- include/steam/steamnetworkingtypes.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/steam/steamnetworkingtypes.h b/include/steam/steamnetworkingtypes.h index 44884235..30da9c95 100644 --- a/include/steam/steamnetworkingtypes.h +++ b/include/steam/steamnetworkingtypes.h @@ -1893,7 +1893,7 @@ typedef SteamNetworkingMessage_t ISteamNetworkingMessage; typedef SteamNetworkingErrMsg SteamDatagramErrMsg; inline void SteamNetworkingIPAddr::Clear() { memset( this, 0, sizeof(*this) ); } -inline bool SteamNetworkingIPAddr::IsIPv6AllZeros() const { const uint64 *q = (const uint64 *)m_ipv6; return q[0] == 0 && q[1] == 0; } +inline bool SteamNetworkingIPAddr::IsIPv6AllZeros() const { uint64 q[2] = {}; memcpy(q, m_ipv6, sizeof(m_ipv6)); return q[0] == 0 && q[1] == 0; } inline void SteamNetworkingIPAddr::SetIPv6( const uint8 *ipv6, uint16 nPort ) { memcpy( m_ipv6, ipv6, 16 ); m_port = nPort; } inline void SteamNetworkingIPAddr::SetIPv4( uint32 nIP, uint16 nPort ) { m_ipv4.m_8zeros = 0; m_ipv4.m_0000 = 0; m_ipv4.m_ffff = 0xffff; m_ipv4.m_ip[0] = uint8(nIP>>24); m_ipv4.m_ip[1] = uint8(nIP>>16); m_ipv4.m_ip[2] = uint8(nIP>>8); m_ipv4.m_ip[3] = uint8(nIP); m_port = nPort; } inline bool SteamNetworkingIPAddr::IsIPv4() const { return m_ipv4.m_8zeros == 0 && m_ipv4.m_0000 == 0 && m_ipv4.m_ffff == 0xffff; }