Skip to content

Commit cc3c6d5

Browse files
committed
fix: encode versional size position
1 parent 879e118 commit cc3c6d5

2 files changed

Lines changed: 15 additions & 11 deletions

File tree

src/Imcodec.ObjectProperty/Property.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ private static bool EncodeElement(BitWriter writer, ObjectSerializer serializer,
159159
return Property<T>.EncodeEnum(writer, val!, serializer);
160160
}
161161
else if (StreamPropertyCodec.TryGetWriter(InnerType, out var codec)) {
162-
codec.Invoke(writer, (T) val!);
162+
codec.Invoke(writer, val!);
163163

164164
return true;
165165
}

src/Imcodec.ObjectProperty/PropertyClass.cs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ internal bool Decode(BitReader reader, ObjectSerializer serializer) {
133133
}
134134

135135
private bool EncodeVersionable(BitWriter writer, ObjectSerializer serializer) {
136+
var objectStart = writer.BitPos();
136137
writer.WriteUInt32(0); // Placeholder for the size.
137138

138139
foreach (var property in Properties) {
@@ -141,27 +142,25 @@ private bool EncodeVersionable(BitWriter writer, ObjectSerializer serializer) {
141142
}
142143

143144
// Write the hash and size of the property.
145+
var sizeStart = writer.BitPos();
144146
writer.WriteUInt32(0); // Placeholder for the size.
145147
writer.WriteUInt32(property.Hash);
146148

147-
var sizeBitPos = writer.BitPos();
149+
var preEncodeBitPos = writer.BitPos();
148150
var encodeSuccess = property.Encode(writer, serializer);
149-
if (!encodeSuccess) {
150-
return false;
151-
}
152151

153152
// Write the size of the property.
154-
var size = writer.BitPos() - sizeBitPos;
155-
writer.SeekBit(sizeBitPos);
153+
var size = writer.BitPos() - preEncodeBitPos;
154+
writer.SeekBit(sizeStart);
156155
writer.WriteUInt32((uint)size);
157-
writer.SeekBit(sizeBitPos + size);
156+
writer.SeekBit(preEncodeBitPos + size);
158157
}
159158

160159
// Write the size of the object.
161-
var objectSize = writer.BitPos();
162-
writer.SeekBit(0);
160+
var objectSize = writer.BitPos() - objectStart;
161+
writer.SeekBit(objectStart);
163162
writer.WriteUInt32((uint)objectSize);
164-
writer.SeekBit(objectSize);
163+
writer.SeekBit(objectStart + objectSize);
165164

166165
return true;
167166
}
@@ -180,6 +179,11 @@ private bool DecodeVersionable(BitReader reader, ObjectSerializer serializer) {
180179
var propertySize = reader.ReadUInt32();
181180
var propertyHash = reader.ReadUInt32();
182181

182+
// A property size of 0 would cause an infinite loop.
183+
if (propertySize == 0) {
184+
return false;
185+
}
186+
183187
// Ensure that the property exists. If it does, decode it.
184188
if (propMap.TryGetValue(propertyHash, out var property)) {
185189
property.Decode(reader, serializer);

0 commit comments

Comments
 (0)