Skip to content

Commit f52860e

Browse files
authored
Use RAII for group session iteration (#32970) (#33294)
* Use RAII for iterator management * Restyle * Fix typo * Fix naming a bit now that I made this a template * Make it clear that class member is initialized
1 parent a836887 commit f52860e

File tree

1 file changed

+32
-4
lines changed

1 file changed

+32
-4
lines changed

src/transport/SessionManager.cpp

+32-4
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,32 @@ using Transport::SecureSession;
5757

5858
namespace {
5959
Global<GroupPeerTable> gGroupPeerTable;
60+
61+
/// RAII class for iterators that guarantees that Release() will be called
62+
/// on the underlying type
63+
template <typename Releasable>
64+
class AutoRelease
65+
{
66+
public:
67+
AutoRelease(Releasable * iter) : mIter(iter) {}
68+
~AutoRelease() { Release(); }
69+
70+
Releasable * operator->() { return mIter; }
71+
const Releasable * operator->() const { return mIter; }
72+
73+
bool IsNull() const { return mIter == nullptr; }
74+
75+
void Release()
76+
{
77+
VerifyOrReturn(mIter != nullptr);
78+
mIter->Release();
79+
mIter = nullptr;
80+
}
81+
82+
private:
83+
Releasable * mIter = nullptr;
84+
};
85+
6086
} // namespace
6187

6288
uint32_t EncryptedPacketBufferHandle::GetMessageCounter() const
@@ -868,8 +894,11 @@ void SessionManager::SecureGroupMessageDispatch(const PacketHeader & partialPack
868894

869895
// Trial decryption with GroupDataProvider
870896
Credentials::GroupDataProvider::GroupSession groupContext;
871-
auto iter = groups->IterateGroupSessions(partialPacketHeader.GetSessionId());
872-
if (iter == nullptr)
897+
898+
AutoRelease<Credentials::GroupDataProvider::GroupSessionIterator> iter(
899+
groups->IterateGroupSessions(partialPacketHeader.GetSessionId()));
900+
901+
if (iter.IsNull())
873902
{
874903
ChipLogError(Inet, "Failed to retrieve Groups iterator. Discarding everything");
875904
return;
@@ -916,7 +945,7 @@ void SessionManager::SecureGroupMessageDispatch(const PacketHeader & partialPack
916945
}
917946
#endif // CHIP_CONFIG_PRIVACY_ACCEPT_NONSPEC_SVE2
918947
}
919-
iter->Release();
948+
iter.Release();
920949

921950
if (!decrypted)
922951
{
@@ -954,7 +983,6 @@ void SessionManager::SecureGroupMessageDispatch(const PacketHeader & partialPack
954983
gGroupPeerTable->FindOrAddPeer(groupContext.fabric_index, packetHeaderCopy.GetSourceNodeId().Value(),
955984
packetHeaderCopy.IsSecureSessionControlMsg(), counter))
956985
{
957-
958986
if (Credentials::GroupDataProvider::SecurityPolicy::kTrustFirst == groupContext.security_policy)
959987
{
960988
err = counter->VerifyOrTrustFirstGroup(packetHeaderCopy.GetMessageCounter());

0 commit comments

Comments
 (0)