@@ -21,13 +21,14 @@ pub struct HeaderBytes {
2121 // Offset into the bytes where the header starts. This is necessary to
2222 // guarantee alignment at the moment.
2323 offset : usize ,
24+ structure_len : usize ,
2425 bytes : Box < [ u8 ] > ,
2526}
2627
2728impl HeaderBytes {
2829 /// Returns the bytes. They are guaranteed to be correctly aligned.
2930 pub fn as_bytes ( & self ) -> & [ u8 ] {
30- let slice = & self . bytes [ self . offset ..] ;
31+ let slice = & self . bytes [ self . offset ..self . offset + self . structure_len ] ;
3132 // At this point, the alignment is guaranteed. If not, something is
3233 // broken fundamentally.
3334 assert_eq ! ( slice. as_ptr( ) . align_offset( 8 ) , 0 ) ;
@@ -166,7 +167,8 @@ impl HeaderBuilder {
166167
167168 // We allocate more than necessary so that we can ensure an correct
168169 // alignment within this data.
169- let alloc_len = self . expected_len ( ) + 7 ;
170+ let expected_len = self . expected_len ( ) ;
171+ let alloc_len = expected_len + 7 ;
170172 let mut bytes = Vec :: < u8 > :: with_capacity ( alloc_len) ;
171173 // Pointer to check that no relocation happened.
172174 let alloc_ptr = bytes. as_ptr ( ) ;
@@ -209,9 +211,11 @@ impl HeaderBuilder {
209211 // We don't want that!
210212 let bytes = unsafe { Box :: from_raw ( bytes. leak ( ) ) } ;
211213
212- assert_eq ! ( bytes. len( ) , alloc_len) ;
213-
214- HeaderBytes { offset, bytes }
214+ HeaderBytes {
215+ offset,
216+ bytes,
217+ structure_len : expected_len,
218+ }
215219 }
216220
217221 /// Helper method that adds all the tags to the given vector.
@@ -223,7 +227,7 @@ impl HeaderBuilder {
223227 false ,
224228 ) ;
225229
226- if let Some ( irs) = self . information_request_tag . take ( ) {
230+ if let Some ( irs) = self . information_request_tag . clone ( ) {
227231 Self :: build_add_bytes ( bytes, & irs. build ( ) , false )
228232 }
229233 if let Some ( tag) = self . address_tag . as_ref ( ) {
@@ -323,7 +327,7 @@ mod tests {
323327 #[ test]
324328 fn test_builder ( ) {
325329 // Step 1/2: Build Header
326- let mb2_hdr_data = {
330+ let ( mb2_hdr_data, expected_len ) = {
327331 let builder = HeaderBuilder :: new ( HeaderTagISA :: I386 ) ;
328332 // Multiboot2 basic header + end tag
329333 let mut expected_len = 16 + 8 ;
@@ -359,9 +363,11 @@ mod tests {
359363 println ! ( "builder: {:#?}" , builder) ;
360364 println ! ( "expected_len: {} bytes" , builder. expected_len( ) ) ;
361365
362- builder. build ( )
366+ ( builder. build ( ) , expected_len )
363367 } ;
364368
369+ assert_eq ! ( mb2_hdr_data. as_bytes( ) . len( ) , expected_len) ;
370+
365371 // Step 2/2: Test the built Header
366372 {
367373 let mb2_hdr = mb2_hdr_data. as_ptr ( ) . cast ( ) ;
0 commit comments