Skip to content

Commit 510713a

Browse files
committed
Enforce const correctness for deserialization in TableEntryData
1 parent 7c1536e commit 510713a

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

src/app/storage/FabricTableImpl.ipp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,19 @@ struct EndpointEntryCount : public PersistentData<kPersistentBufferEntryCountByt
100100
}
101101
};
102102

103+
// Prevent mutations from happening in TableEntryData::Serialize
104+
template <typename T>
105+
class ConstCorrectRef
106+
{
107+
T & mRef;
108+
109+
public:
110+
inline ConstCorrectRef(T & ref) : mRef(ref) {}
111+
112+
inline const T * operator->() const { return &mRef; }
113+
inline T * operator->() { return &mRef; }
114+
};
115+
103116
template <class StorageId, class StorageData>
104117
struct TableEntryData : DataAccessor
105118
{
@@ -110,7 +123,7 @@ struct TableEntryData : DataAccessor
110123
FabricIndex fabric_index = kUndefinedFabricIndex;
111124
EntryIndex index = 0;
112125
bool first = true;
113-
Data::TableEntry<StorageId, StorageData> & mEntry;
126+
ConstCorrectRef<Data::TableEntry<StorageId, StorageData>> mEntry;
114127

115128
TableEntryData(EndpointId endpoint, FabricIndex fabric, TableEntry & entry, EntryIndex idx = 0) :
116129
endpoint_id(endpoint), fabric_index(fabric), index(idx), mEntry(entry)
@@ -124,16 +137,16 @@ struct TableEntryData : DataAccessor
124137
return CHIP_NO_ERROR;
125138
}
126139

127-
void Clear() override { this->mEntry.mStorageData.Clear(); }
140+
void Clear() override { this->mEntry->mStorageData.Clear(); }
128141

129142
CHIP_ERROR Serialize(TLV::TLVWriter & writer) const override
130143
{
131144
TLV::TLVType container;
132145
ReturnErrorOnFailure(writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, container));
133146

134-
ReturnErrorOnFailure(Serializer::SerializeId(writer, this->mEntry.mStorageId));
147+
ReturnErrorOnFailure(Serializer::SerializeId(writer, this->mEntry->mStorageId));
135148

136-
ReturnErrorOnFailure(Serializer::SerializeData(writer, this->mEntry.mStorageData));
149+
ReturnErrorOnFailure(Serializer::SerializeData(writer, this->mEntry->mStorageData));
137150

138151
return writer.EndContainer(container);
139152
}
@@ -145,9 +158,9 @@ struct TableEntryData : DataAccessor
145158
TLV::TLVType container;
146159
ReturnErrorOnFailure(reader.EnterContainer(container));
147160

148-
ReturnErrorOnFailure(Serializer::DeserializeId(reader, this->mEntry.mStorageId));
161+
ReturnErrorOnFailure(Serializer::DeserializeId(reader, this->mEntry->mStorageId));
149162

150-
ReturnErrorOnFailure(Serializer::DeserializeData(reader, this->mEntry.mStorageData));
163+
ReturnErrorOnFailure(Serializer::DeserializeData(reader, this->mEntry->mStorageData));
151164

152165
return reader.ExitContainer(container);
153166
}

0 commit comments

Comments
 (0)