From e512dd0c6808c5ff6b58c005728b8e5b7eeb697d Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Thu, 3 Mar 2022 23:26:08 -0600 Subject: [PATCH 1/3] Prevent deferred link race conditions --- .../plNetClient/plNetLinkingMgr.cpp | 51 +++++++++++++++---- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp index 15c8cea2..c6a88646 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp @@ -504,25 +504,56 @@ bool plNetLinkingMgr::IProcessVaultNotifyMsg(plVaultNotifyMsg* msg) return false; } - if (cVaultLink != nil) - { - // This is something that Cyan does... >.< - // It's very useful though... + if (cVaultLink != nil) { + // Verify that if the Age vault already exists that it matches the requested + // deferred link. If it doesn't exist, well, I hope you're happy with the result. VaultAgeLinkNode accLink(cVaultLink); - accLink.CopyTo(cur); - if (RelVaultNode* rvnInfo = cVaultLink->GetChildNodeIncRef(plVault::kNodeType_AgeInfo, 1)) - { + if (RelVaultNode* rvnInfo = cVaultLink->GetChildNodeIncRef(plVault::kNodeType_AgeInfo, 1)) { + plAgeInfoStruct dest; + VaultAgeInfoNode accInfo(rvnInfo); - accInfo.CopyTo(cur->GetAgeInfo()); + accInfo.CopyTo(&dest); + if (!dest.IsEqualTo(fDeferredLink->GetAgeLink()->GetAgeInfo())) { + hsLogEntry( + plNetClientMgr::GetInstance()->DebugMsg( + "Waiting for a deferred link to '%s' but got AgeInfo for '%s' instead.", + fDeferredLink->GetAgeLink()->AsStdString().c_str(), + dest.AsStdString().c_str() + ); + ); + + rvnInfo->DecRef(); + return false; + } + rvnInfo->DecRef(); } + // If we're still here, that means the links match. Set the vault copy as our current + // AgeLink and AgeInfo. Note this mainly copies the AgeInfo. + accLink.CopyTo(cur); + hsLogEntry( + plNetClientMgr::GetInstance()->DebugMsg( + "Performing deferred link to '%s'", + cur->AsStdString().c_str() + ); + ); + + // Steals fDeferredLink IDoLink(fDeferredLink); fDeferredLink = nil; - return true; cVaultLink->DecRef(); - } + + return true; + } else { + hsLogEntry( + plNetClientMgr::GetInstance()->ErrorMsg( + "Waiting for a deferred link to '%s' but got a garbage link?", + fDeferredLink->GetAgeLink()->AsStdString().c_str() + ) + ); + } return false; } From 2f1bb87056253129af99d65cb89fb6e148e3cdab Mon Sep 17 00:00:00 2001 From: ZarothYe Date: Sat, 5 Mar 2022 13:34:52 -0600 Subject: [PATCH 2/3] Ensure pyGUIControlListBox::GetElementW can't attempt to return a null pointer as a std::wstring --- Sources/Plasma/FeatureLib/pfPython/pyGUIControlListBox.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Sources/Plasma/FeatureLib/pfPython/pyGUIControlListBox.cpp b/Sources/Plasma/FeatureLib/pfPython/pyGUIControlListBox.cpp index 09413368..19f45d73 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyGUIControlListBox.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/pyGUIControlListBox.cpp @@ -587,16 +587,17 @@ std::wstring pyGUIControlListBox::GetElementW( UInt16 idx ) { // if its a text element type then it should be safe to cast it to a pfGUIListText pfGUIListText* letext = (pfGUIListText*)le; - return letext->GetText(); + return (letext->GetText() != nullptr) ? letext->GetText() : L""; } else if ( le->GetType() == pfGUIListElement::kTreeRoot ) { pfGUIListTreeRoot* elroot = (pfGUIListTreeRoot*)le; - return elroot->GetTitle(); + return (elroot->GetTitle() != nullptr) ? elroot->GetTitle() : L""; } } } } + return L""; } From e93db035ba4511e53c8bb5b8fbcd108f962ee988 Mon Sep 17 00:00:00 2001 From: rarified Date: Wed, 9 Mar 2022 09:44:05 -0700 Subject: [PATCH 3/3] Revert "Fixes bug where avatar run-lock state can get confused after alt-tabbing" This reverts commit 69dac251b6742ab7f77bed1a676e8de52920bd90. --- .../Plasma/PubUtilLib/plInputCore/plInputDevice.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Sources/Plasma/PubUtilLib/plInputCore/plInputDevice.cpp b/Sources/Plasma/PubUtilLib/plInputCore/plInputDevice.cpp index af3f6132..eec78f77 100644 --- a/Sources/Plasma/PubUtilLib/plInputCore/plInputDevice.cpp +++ b/Sources/Plasma/PubUtilLib/plInputCore/plInputDevice.cpp @@ -176,16 +176,19 @@ void plKeyboardDevice::HandleKeyEvent(plOSMsg message, plKeyDef key, bool bKeyDo if (key == KEY_SHIFT) { fShiftKeyDown = bKeyDown; +// return; } if (key == KEY_CTRL) { fCtrlKeyDown = bKeyDown; +// return; } if (key == KEY_CAPSLOCK) { - if (!bKeyRepeat) + // Keyboards toggle the light on key-down, so I'm going with that. + if (bKeyDown && !bKeyRepeat) { - fCapsLockLock = (GetKeyState(KEY_CAPSLOCK) & 1) == 1; + fCapsLockLock = !fCapsLockLock; plAvatarInputInterface::GetInstance()->ForceAlwaysRun(fCapsLockLock); } } @@ -205,8 +208,7 @@ void plKeyboardDevice::HandleWindowActivate(bool bActive, HWND hWnd) { if (bActive) { - // Refresh the caps lock state - HandleKeyEvent(KEYDOWN, KEY_CAPSLOCK, nil, false); + fCtrlKeyDown = false; } else {