@@ -647,13 +647,15 @@ pub struct FriendState {
647
647
pub const FRIENDSTATEBYTES : usize = 1 // "Status"
648
648
+ PUBLICKEYBYTES
649
649
/* Friend request message */ + REQUEST_MSG_LEN
650
+ /* padding1 */ + 1
650
651
/* actual size of FR message */ + 2
651
652
/* Name; */ + NAME_LEN
652
653
/* actual size of Name */ + 2
653
654
/* Status msg; */ + STATUS_MSG_LEN
655
+ /* padding2 */ + 1
654
656
/* actual size of status msg */ + 2
655
657
/* UserStatus */ + 1
656
- /* padding */ + 3
658
+ /* padding3 */ + 3
657
659
/* only used for sending FR */ + NOSPAMBYTES
658
660
/* last time seen */ + 8 ;
659
661
@@ -667,27 +669,32 @@ impl FromBytes for FriendState {
667
669
668
670
let Parsed ( pk, bytes) = try!( PublicKey :: parse_bytes ( bytes) ) ;
669
671
670
- // supply length
672
+ // supply length and number of bytes that need to be padded
673
+ // if no padding needed, supply `0`
671
674
// TODO: refactor?
672
- fn get_bytes ( bytes : & [ u8 ] , len : usize ) -> ParseResult < Vec < u8 > > {
675
+ fn get_bytes ( bytes : & [ u8 ] , len : usize , pad : usize )
676
+ -> ParseResult < Vec < u8 > >
677
+ {
673
678
let str_len = u16:: from_be ( array_to_u16 (
674
- & [ bytes[ len] , bytes[ len+1 ] ] ) ) as usize ;
679
+ & [ bytes[ len+pad ] , bytes[ len+pad +1 ] ] ) ) as usize ;
675
680
if str_len > len {
676
681
return parse_error ! ( "Value demands {} bytes when it is \
677
682
supposed to take {}!", str_len, len)
678
683
}
679
684
680
- Ok ( Parsed ( bytes[ ..str_len] . to_vec ( ) , & bytes[ len+2 ..] ) )
685
+ Ok ( Parsed ( bytes[ ..str_len] . to_vec ( ) , & bytes[ len+pad+ 2 ..] ) )
681
686
} ;
682
687
683
- let Parsed ( fr_msg, bytes) = try!( get_bytes ( bytes, REQUEST_MSG_LEN ) ) ;
688
+ let Parsed ( fr_msg, bytes) = try!( get_bytes ( bytes, REQUEST_MSG_LEN , 1 ) ) ;
684
689
685
690
// TODO: refactor?
686
- let Parsed ( name_bytes, bytes) = try!( get_bytes ( bytes, NAME_LEN ) ) ;
691
+ let Parsed ( name_bytes, bytes) = try!( get_bytes ( bytes, NAME_LEN , 0 ) ) ;
687
692
let name = Name ( name_bytes) ;
688
693
689
694
// TODO: refactor?
690
- let Parsed ( status_msg_bytes, bytes) = try!( get_bytes ( bytes, STATUS_MSG_LEN ) ) ;
695
+ let Parsed ( status_msg_bytes, bytes) = try!(
696
+ get_bytes ( bytes, STATUS_MSG_LEN , 1 )
697
+ ) ;
691
698
let status_msg = StatusMsg ( status_msg_bytes) ;
692
699
693
700
let Parsed ( user_status, bytes) = try!( UserStatus :: parse_bytes ( bytes) ) ;
@@ -717,13 +724,12 @@ impl FromBytes for FriendState {
717
724
718
725
impl ToBytes for FriendState {
719
726
fn to_bytes ( & self ) -> Vec < u8 > {
720
- // extend vec with all contents of slice and padd with `0`s up to `len`
727
+ // extend vec with all contents of slice and pad with `0`s up to `len`
721
728
// assume that Vec isn't too big for fr_msg
722
729
fn ext_vec ( vec : & mut Vec < u8 > , slice : & [ u8 ] , len : usize ) {
723
- vec. extend_from_slice ( slice) ;
724
- for _ in 0 ..( len - slice. len ( ) ) {
725
- vec. push ( 0 ) ;
726
- }
730
+ let mut to_add = slice. to_vec ( ) ;
731
+ append_zeros ( & mut to_add, len) ;
732
+ vec. append ( & mut to_add) ;
727
733
}
728
734
729
735
let len_to_u16be = |len| u16_to_array ( ( len as u16 ) . to_be ( ) ) ;
@@ -736,25 +742,29 @@ impl ToBytes for FriendState {
736
742
// pk
737
743
result. extend_from_slice ( & self . pk . 0 ) ;
738
744
739
- // friend request msg and its length
745
+ // friend request msg..
740
746
ext_vec ( & mut result, & self . fr_msg , REQUEST_MSG_LEN ) ;
747
+ // padding
748
+ result. push ( 0 ) ;
749
+ // .. and its length
741
750
result. extend_from_slice ( & len_to_u16be ( self . fr_msg . len ( ) ) ) ;
742
751
743
752
// name and its length
744
753
ext_vec ( & mut result, & self . name . 0 , NAME_LEN ) ;
745
754
result. extend_from_slice ( & len_to_u16be ( self . name . 0 . len ( ) ) ) ;
746
755
747
- // status msg and its length
756
+ // status msg ..
748
757
ext_vec ( & mut result, & self . status_msg . 0 , STATUS_MSG_LEN ) ;
758
+ // padding
759
+ result. push ( 0 ) ;
760
+ // .. and its length
749
761
result. extend_from_slice ( & len_to_u16be ( self . status_msg . 0 . len ( ) ) ) ;
750
762
751
763
// UserStatus
752
764
result. push ( self . user_status as u8 ) ;
753
765
754
766
// padding
755
- for _ in 0 ..3 {
756
- result. push ( 0 ) ;
757
- }
767
+ append_zeros ( & mut result, FRIENDSTATEBYTES - 12 ) ;
758
768
759
769
// NoSpam
760
770
result. extend_from_slice ( & self . nospam . 0 ) ;
@@ -1414,13 +1424,14 @@ fn friend_state_parse_bytes_test() {
1414
1424
let mut bytes = fs_bytes. clone ( ) ;
1415
1425
// TODO: change to inclusive range (`...`) once gets stabilised
1416
1426
// rust #28237
1417
- for b in 5 ..u8 :: max_value ( ) {
1427
+ for b in 5 .. {
1418
1428
bytes[ 0 ] = b;
1419
1429
assert_error ( & bytes, & format ! ( "Unknown FriendStatus: {}" , b) ) ;
1430
+ if b == u8:: max_value ( ) { break ; }
1420
1431
}
1421
1432
}
1422
1433
1423
- const FR_MSG_LEN_POS : usize = 1 + PUBLICKEYBYTES + REQUEST_MSG_LEN ;
1434
+ const FR_MSG_LEN_POS : usize = 1 + PUBLICKEYBYTES + REQUEST_MSG_LEN + 1 ;
1424
1435
{ // friend request message lenght check
1425
1436
let mut bytes = fs_bytes. clone ( ) ;
1426
1437
for i in ( REQUEST_MSG_LEN +1 ) ..2500 { // too slow with bigger ranges
@@ -1446,7 +1457,8 @@ fn friend_state_parse_bytes_test() {
1446
1457
}
1447
1458
}
1448
1459
1449
- const STATUS_MSG_LEN_POS : usize = NAME_LEN_POS + STATUS_MSG_LEN + 2 ;
1460
+ // padding + bytes containing length
1461
+ const STATUS_MSG_LEN_POS : usize = NAME_LEN_POS + STATUS_MSG_LEN + 3 ;
1450
1462
{ // friend name lenght check
1451
1463
let mut bytes = fs_bytes. clone ( ) ;
1452
1464
for i in ( STATUS_MSG_LEN +1 ) ..2500 { // too slow with bigger ranges
0 commit comments