File tree Expand file tree Collapse file tree 1 file changed +14
-7
lines changed Expand file tree Collapse file tree 1 file changed +14
-7
lines changed Original file line number Diff line number Diff line change @@ -903,30 +903,37 @@ void USBMSD::memoryRead(void)
903
903
904
904
bool USBMSD::infoTransfer (void )
905
905
{
906
- uint32_t n ;
906
+ uint32_t addr_block ;
907
907
908
908
// Logical Block Address of First Block
909
- n = (_cbw.CB [2 ] << 24 ) | (_cbw.CB [3 ] << 16 ) | (_cbw.CB [4 ] << 8 ) | (_cbw.CB [5 ] << 0 );
909
+ addr_block = (_cbw.CB [2 ] << 24 ) | (_cbw.CB [3 ] << 16 ) | (_cbw.CB [4 ] << 8 ) | (_cbw.CB [5 ] << 0 );
910
+
911
+ _addr = addr_block * _block_size;
910
912
911
- _addr = n * _block_size;
913
+ if ((addr_block >= _block_count) || (_addr >= _memory_size)) {
914
+ _csw.Status = CSW_FAILED;
915
+ sendCSW ();
916
+ return false ;
917
+ }
912
918
919
+ uint32_t length_blocks = 0 ;
913
920
// Number of Blocks to transfer
914
921
switch (_cbw.CB [0 ]) {
915
922
case READ10:
916
923
case WRITE10:
917
924
case VERIFY10:
918
- n = (_cbw.CB [7 ] << 8 ) | (_cbw.CB [8 ] << 0 );
925
+ length_blocks = (_cbw.CB [7 ] << 8 ) | (_cbw.CB [8 ] << 0 );
919
926
break ;
920
927
921
928
case READ12:
922
929
case WRITE12:
923
- n = (_cbw.CB [6 ] << 24 ) | (_cbw.CB [7 ] << 16 ) | (_cbw.CB [8 ] << 8 ) | (_cbw.CB [9 ] << 0 );
930
+ length_blocks = (_cbw.CB [6 ] << 24 ) | (_cbw.CB [7 ] << 16 ) | (_cbw.CB [8 ] << 8 ) | (_cbw.CB [9 ] << 0 );
924
931
break ;
925
932
}
926
933
927
- _length = n * _block_size;
934
+ _length = length_blocks * _block_size;
928
935
929
- if (!_cbw.DataLength ) { // host requests no data
936
+ if (!_cbw.DataLength || !length_blocks || (length_blocks > _block_count - addr_block) || (_length > _memory_size - _addr)) { // host requests no data or wrong length
930
937
_csw.Status = CSW_FAILED;
931
938
sendCSW ();
932
939
return false ;
You can’t perform that action at this time.
0 commit comments