From 645e1745e240bfa197ec0cd43f84131e77bd1f6c Mon Sep 17 00:00:00 2001 From: Fletcher Dunn Date: Sat, 27 May 2023 19:00:42 -0700 Subject: [PATCH] Tweak edge condition handling for automatic fixup of out-of-order packets P4:8088085 --- .../steamnetworkingsockets_stats.cpp | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/steamnetworkingsockets/steamnetworkingsockets_stats.cpp b/src/steamnetworkingsockets/steamnetworkingsockets_stats.cpp index 1b454c0..012b7e8 100644 --- a/src/steamnetworkingsockets/steamnetworkingsockets_stats.cpp +++ b/src/steamnetworkingsockets/steamnetworkingsockets_stats.cpp @@ -157,7 +157,17 @@ void CPossibleOutOfOrderPacket::Detach() { if ( m_pOwner ) { - Assert( m_pOwner->m_pPossibleOutOfOrderPacket == this ); + #ifdef IS_STEAMDATAGRAMROUTER + if ( unlikely( m_pOwner->m_pPossibleOutOfOrderPacket != this ) ) + { + // This is happening very rarely on public. Let's figure out what it is + // by collecting a core. + // Intentionally crash. + *(volatile int *)nullptr = 0; + } + #else + Assert( m_pOwner->m_pPossibleOutOfOrderPacket == this ); + #endif m_pOwner->m_pPossibleOutOfOrderPacket = nullptr; m_pOwner = nullptr; } @@ -233,6 +243,14 @@ void LinkStatsTrackerBase::InitInternal( SteamNetworkingMicroseconds usecNow ) m_nReplyTimeoutsSinceLastRecv = 0; m_usecWhenTimeoutStarted = 0; m_eActivityLevel = ELinkActivityLevel::Disconnected; + + // Should not re-initialize + if ( unlikely( m_pPossibleOutOfOrderPacket ) ) + { + Assert( false ); + m_pPossibleOutOfOrderPacket->Destroy(); + Assert( m_pPossibleOutOfOrderPacket == nullptr ); + } } void LinkStatsTrackerBase::SetActivityLevelInternal( ELinkActivityLevel eActivityLevel, SteamNetworkingMicroseconds usecNow )