@@ -219,57 +219,61 @@ impl VsockPacket {
219
219
///
220
220
/// Return value will equal the total length of the underlying descriptor chain's buffers,
221
221
/// minus the length of the vsock header.
222
- pub fn buf_size ( & self ) -> usize {
222
+ pub fn buf_size ( & self ) -> u32 {
223
223
let chain_length = match self . buffer {
224
224
VsockPacketBuffer :: Tx ( ref iovec_buf) => iovec_buf. len ( ) ,
225
225
VsockPacketBuffer :: Rx ( ref iovec_buf) => iovec_buf. len ( ) ,
226
226
} ;
227
- ( chain_length - VSOCK_PKT_HDR_SIZE ) as usize
227
+ chain_length - VSOCK_PKT_HDR_SIZE
228
228
}
229
229
230
230
pub fn read_at_offset_from < T : ReadVolatile + Debug > (
231
231
& mut self ,
232
232
src : & mut T ,
233
- offset : usize ,
234
- count : usize ,
235
- ) -> Result < usize , VsockError > {
233
+ offset : u32 ,
234
+ count : u32 ,
235
+ ) -> Result < u32 , VsockError > {
236
236
match self . buffer {
237
237
VsockPacketBuffer :: Tx ( _) => Err ( VsockError :: UnwritableDescriptor ) ,
238
238
VsockPacketBuffer :: Rx ( ref mut buffer) => {
239
239
if count
240
- > ( buffer. len ( ) as usize )
241
- . saturating_sub ( VSOCK_PKT_HDR_SIZE as usize )
240
+ > buffer
241
+ . len ( )
242
+ . saturating_sub ( VSOCK_PKT_HDR_SIZE )
242
243
. saturating_sub ( offset)
243
244
{
244
245
return Err ( VsockError :: GuestMemoryBounds ) ;
245
246
}
246
247
247
248
buffer
248
- . write_volatile_at ( src, offset + VSOCK_PKT_HDR_SIZE as usize , count)
249
+ . write_volatile_at ( src, ( offset + VSOCK_PKT_HDR_SIZE ) as usize , count as usize )
249
250
. map_err ( |err| VsockError :: GuestMemoryMmap ( GuestMemoryError :: from ( err) ) )
251
+ . and_then ( |read| read. try_into ( ) . map_err ( |_| VsockError :: DescChainOverflow ) )
250
252
}
251
253
}
252
254
}
253
255
254
256
pub fn write_from_offset_to < T : WriteVolatile + Debug > (
255
257
& self ,
256
258
dst : & mut T ,
257
- offset : usize ,
258
- count : usize ,
259
- ) -> Result < usize , VsockError > {
259
+ offset : u32 ,
260
+ count : u32 ,
261
+ ) -> Result < u32 , VsockError > {
260
262
match self . buffer {
261
263
VsockPacketBuffer :: Tx ( ref buffer) => {
262
264
if count
263
- > ( buffer. len ( ) as usize )
264
- . saturating_sub ( VSOCK_PKT_HDR_SIZE as usize )
265
+ > buffer
266
+ . len ( )
267
+ . saturating_sub ( VSOCK_PKT_HDR_SIZE )
265
268
. saturating_sub ( offset)
266
269
{
267
270
return Err ( VsockError :: GuestMemoryBounds ) ;
268
271
}
269
272
270
273
buffer
271
- . read_volatile_at ( dst, offset + VSOCK_PKT_HDR_SIZE as usize , count)
274
+ . read_volatile_at ( dst, ( offset + VSOCK_PKT_HDR_SIZE ) as usize , count as usize )
272
275
. map_err ( |err| VsockError :: GuestMemoryMmap ( GuestMemoryError :: from ( err) ) )
276
+ . and_then ( |read| read. try_into ( ) . map_err ( |_| VsockError :: DescChainOverflow ) )
273
277
}
274
278
VsockPacketBuffer :: Rx ( _) => Err ( VsockError :: UnreadableDescriptor ) ,
275
279
}
@@ -537,10 +541,7 @@ mod tests {
537
541
handler_ctx. device . queues [ RXQ_INDEX ] . pop ( ) . unwrap ( ) ,
538
542
)
539
543
. unwrap ( ) ;
540
- assert_eq ! (
541
- pkt. buf_size( ) ,
542
- handler_ctx. guest_rxvq. dtable[ 1 ] . len. get( ) as usize
543
- ) ;
544
+ assert_eq ! ( pkt. buf_size( ) , handler_ctx. guest_rxvq. dtable[ 1 ] . len. get( ) ) ;
544
545
}
545
546
546
547
// Test case: read-only RX packet header.
@@ -646,35 +647,38 @@ mod tests {
646
647
. unwrap ( ) ;
647
648
648
649
let buf_desc = & mut handler_ctx. guest_rxvq . dtable [ 1 ] ;
649
- assert_eq ! ( pkt. buf_size( ) , buf_desc. len. get( ) as usize ) ;
650
- let zeros = vec ! [ 0_u8 ; pkt. buf_size( ) ] ;
650
+ assert_eq ! ( pkt. buf_size( ) , buf_desc. len. get( ) ) ;
651
+ let zeros = vec ! [ 0_u8 ; pkt. buf_size( ) as usize ] ;
651
652
let data: Vec < u8 > = ( 0 ..pkt. buf_size ( ) )
652
653
. map ( |i| ( ( i as u64 ) & 0xff ) as u8 )
653
654
. collect ( ) ;
654
655
for offset in 0 ..pkt. buf_size ( ) {
655
656
buf_desc. set_data ( & zeros) ;
656
657
657
- let mut expected_data = zeros[ ..offset] . to_vec ( ) ;
658
- expected_data. extend_from_slice ( & data[ ..pkt. buf_size ( ) - offset] ) ;
658
+ let mut expected_data = zeros[ ..offset as usize ] . to_vec ( ) ;
659
+ expected_data. extend_from_slice ( & data[ ..( pkt. buf_size ( ) - offset) as usize ] ) ;
659
660
660
661
pkt. read_at_offset_from ( & mut data. as_slice ( ) , offset, pkt. buf_size ( ) - offset)
661
662
. unwrap ( ) ;
662
663
663
664
buf_desc. check_data ( & expected_data) ;
664
665
665
- let mut buf = vec ! [ 0 ; pkt. buf_size( ) ] ;
666
+ let mut buf = vec ! [ 0 ; pkt. buf_size( ) as usize ] ;
666
667
pkt2. write_from_offset_to ( & mut buf. as_mut_slice ( ) , offset, pkt. buf_size ( ) - offset)
667
668
. unwrap ( ) ;
668
- assert_eq ! ( & buf[ ..pkt. buf_size( ) - offset] , & expected_data[ offset..] ) ;
669
+ assert_eq ! (
670
+ & buf[ ..( pkt. buf_size( ) - offset) as usize ] ,
671
+ & expected_data[ offset as usize ..]
672
+ ) ;
669
673
}
670
674
671
675
let oob_cases = vec ! [
672
676
( 1 , pkt. buf_size( ) ) ,
673
677
( pkt. buf_size( ) , 1 ) ,
674
- ( usize :: MAX , 1 ) ,
675
- ( 1 , usize :: MAX ) ,
678
+ ( u32 :: MAX , 1 ) ,
679
+ ( 1 , u32 :: MAX ) ,
676
680
] ;
677
- let mut buf = vec ! [ 0 ; pkt. buf_size( ) ] ;
681
+ let mut buf = vec ! [ 0 ; pkt. buf_size( ) as usize ] ;
678
682
for ( offset, count) in oob_cases {
679
683
let res = pkt. read_at_offset_from ( & mut data. as_slice ( ) , offset, count) ;
680
684
assert ! ( matches!( res, Err ( VsockError :: GuestMemoryBounds ) ) ) ;
0 commit comments