@@ -68,8 +68,7 @@ pub struct DownloadHeaderV3 {
6868 pub flag_size : u8 ,
6969 /// Base priority adjustment (signed byte)
7070 pub base_priority : i8 ,
71- /// Reserved bytes (must be zero)
72- #[ br( assert( reserved == [ 0 , 0 , 0 ] , "Reserved field must be zero, got: {:?}" , reserved) ) ]
71+ /// Reserved bytes (not validated)
7372 pub reserved : [ u8 ; 3 ] ,
7473}
7574
@@ -155,9 +154,9 @@ impl DownloadHeader {
155154 /// Calculate total header size in bytes
156155 pub fn header_size ( & self ) -> usize {
157156 match self {
158- Self :: V1 ( _) => 10 , // magic(2) + version(1) + ekey_length(1) + has_checksum(1) + entry_count(4) + tag_count(2)
159- Self :: V2 ( _) => 11 , // V1 + flag_size(1)
160- Self :: V3 ( _) => 15 , // V2 + base_priority(1) + reserved(3)
157+ Self :: V1 ( _) => 11 , // magic(2) + version(1) + ekey_length(1) + has_checksum(1) + entry_count(4) + tag_count(2)
158+ Self :: V2 ( _) => 12 , // V1 + flag_size(1)
159+ Self :: V3 ( _) => 16 , // V2 + base_priority(1) + reserved(3)
161160 }
162161 }
163162
@@ -185,19 +184,6 @@ impl DownloadHeader {
185184 return Err ( DownloadError :: InvalidEncodingKeyLength ( ekey_length) ) ;
186185 }
187186
188- // Version-specific validation
189- match self {
190- Self :: V1 ( _) | Self :: V2 ( _) => {
191- // V1/V2 have no additional fields to validate
192- }
193- Self :: V3 ( h) => {
194- // V3 validation - reserved field should be zero
195- if h. reserved != [ 0 , 0 , 0 ] {
196- return Err ( DownloadError :: ReservedFieldNotZero ( h. reserved ) ) ;
197- }
198- }
199- }
200-
201187 Ok ( ( ) )
202188 }
203189
@@ -282,14 +268,6 @@ impl BinRead for DownloadHeader {
282268 let mut reserved = [ 0u8 ; 3 ] ;
283269 reader. read_exact ( & mut reserved) ?;
284270
285- // Validate reserved field
286- if reserved != [ 0 , 0 , 0 ] {
287- return Err ( binrw:: Error :: Custom {
288- pos : reader. stream_position ( ) . unwrap_or ( 0 ) ,
289- err : Box :: new ( DownloadError :: ReservedFieldNotZero ( reserved) ) ,
290- } ) ;
291- }
292-
293271 Ok ( Self :: V3 ( DownloadHeaderV3 {
294272 magic : base. magic ,
295273 version : base. version ,
@@ -343,7 +321,7 @@ mod tests {
343321 assert ! ( header. has_checksum( ) ) ;
344322 assert_eq ! ( header. flag_size( ) , 0 ) ;
345323 assert_eq ! ( header. base_priority( ) , 0 ) ;
346- assert_eq ! ( header. header_size( ) , 10 ) ;
324+ assert_eq ! ( header. header_size( ) , 11 ) ;
347325 }
348326
349327 #[ test]
@@ -356,7 +334,7 @@ mod tests {
356334 assert ! ( !header. has_checksum( ) ) ;
357335 assert_eq ! ( header. flag_size( ) , 2 ) ;
358336 assert_eq ! ( header. base_priority( ) , 0 ) ;
359- assert_eq ! ( header. header_size( ) , 11 ) ;
337+ assert_eq ! ( header. header_size( ) , 12 ) ;
360338 }
361339
362340 #[ test]
@@ -369,7 +347,7 @@ mod tests {
369347 assert ! ( header. has_checksum( ) ) ;
370348 assert_eq ! ( header. flag_size( ) , 1 ) ;
371349 assert_eq ! ( header. base_priority( ) , -5 ) ;
372- assert_eq ! ( header. header_size( ) , 15 ) ;
350+ assert_eq ! ( header. header_size( ) , 16 ) ;
373351 }
374352
375353 #[ test]
@@ -540,7 +518,7 @@ mod tests {
540518 }
541519
542520 #[ test]
543- fn test_invalid_reserved_field ( ) {
521+ fn test_nonzero_reserved_field_accepted ( ) {
544522 let data = [
545523 b'D' , b'L' , // Magic
546524 3 , // Version
@@ -550,11 +528,15 @@ mod tests {
550528 0 , 5 , // Tag count
551529 0 , // Flag size
552530 0 , // Base priority
553- 1 , 2 , 3 , // Invalid reserved field (should be 0, 0, 0 )
531+ 1 , 2 , 3 , // Non-zero reserved field (accepted per Agent behavior )
554532 ] ;
555533
556- let result = DownloadHeader :: read_options ( & mut Cursor :: new ( & data) , binrw:: Endian :: Big , ( ) ) ;
534+ let header = DownloadHeader :: read_options ( & mut Cursor :: new ( & data) , binrw:: Endian :: Big , ( ) )
535+ . expect ( "Non-zero reserved bytes should be accepted" ) ;
557536
558- assert ! ( result. is_err( ) ) ;
537+ assert_eq ! ( header. version( ) , 3 ) ;
538+ assert_eq ! ( header. entry_count( ) , 10 ) ;
539+ // validate() also should not reject non-zero reserved
540+ assert ! ( header. validate( ) . is_ok( ) ) ;
559541 }
560542}
0 commit comments