Skip to content

Commit c82416f

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

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

src/app/storage/FabricTableImpl.ipp

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

103+
// Prevent mutations from happening in TableEntryData::Serialize
104+
template <typename T>
105+
class ConstCorrectRef {
106+
T& mRef;
107+
public:
108+
inline ConstCorrectRef(T& ref) : mRef(ref) {}
109+
110+
inline const T* operator->() const { return &mRef; }
111+
inline T* operator->() { return &mRef; }
112+
};
113+
103114
template <class StorageId, class StorageData>
104115
struct TableEntryData : DataAccessor
105116
{
@@ -110,7 +121,7 @@ struct TableEntryData : DataAccessor
110121
FabricIndex fabric_index = kUndefinedFabricIndex;
111122
EntryIndex index = 0;
112123
bool first = true;
113-
Data::TableEntry<StorageId, StorageData> & mEntry;
124+
ConstCorrectRef<Data::TableEntry<StorageId, StorageData>> mEntry;
114125

115126
TableEntryData(EndpointId endpoint, FabricIndex fabric, TableEntry & entry, EntryIndex idx = 0) :
116127
endpoint_id(endpoint), fabric_index(fabric), index(idx), mEntry(entry)
@@ -124,16 +135,16 @@ struct TableEntryData : DataAccessor
124135
return CHIP_NO_ERROR;
125136
}
126137

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

129140
CHIP_ERROR Serialize(TLV::TLVWriter & writer) const override
130141
{
131142
TLV::TLVType container;
132143
ReturnErrorOnFailure(writer.StartContainer(TLV::AnonymousTag(), TLV::kTLVType_Structure, container));
133144

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

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

138149
return writer.EndContainer(container);
139150
}
@@ -145,9 +156,9 @@ struct TableEntryData : DataAccessor
145156
TLV::TLVType container;
146157
ReturnErrorOnFailure(reader.EnterContainer(container));
147158

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

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

152163
return reader.ExitContainer(container);
153164
}

0 commit comments

Comments
 (0)