@@ -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