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 @@ -896,30 +896,37 @@ void USBMSD::memoryRead(void)
896
896
897
897
bool USBMSD::infoTransfer (void )
898
898
{
899
- uint32_t n ;
899
+ uint32_t addr_block ;
900
900
901
901
// Logical Block Address of First Block
902
- n = (_cbw.CB [2 ] << 24 ) | (_cbw.CB [3 ] << 16 ) | (_cbw.CB [4 ] << 8 ) | (_cbw.CB [5 ] << 0 );
902
+ addr_block = (_cbw.CB [2 ] << 24 ) | (_cbw.CB [3 ] << 16 ) | (_cbw.CB [4 ] << 8 ) | (_cbw.CB [5 ] << 0 );
903
+
904
+ _addr = addr_block * _block_size;
903
905
904
- _addr = n * _block_size;
906
+ if ((addr_block >= _block_count) || (_addr >= _memory_size)) {
907
+ _csw.Status = CSW_FAILED;
908
+ sendCSW ();
909
+ return false ;
910
+ }
905
911
912
+ uint32_t length_blocks = 0 ;
906
913
// Number of Blocks to transfer
907
914
switch (_cbw.CB [0 ]) {
908
915
case READ10:
909
916
case WRITE10:
910
917
case VERIFY10:
911
- n = (_cbw.CB [7 ] << 8 ) | (_cbw.CB [8 ] << 0 );
918
+ length_blocks = (_cbw.CB [7 ] << 8 ) | (_cbw.CB [8 ] << 0 );
912
919
break ;
913
920
914
921
case READ12:
915
922
case WRITE12:
916
- n = (_cbw.CB [6 ] << 24 ) | (_cbw.CB [7 ] << 16 ) | (_cbw.CB [8 ] << 8 ) | (_cbw.CB [9 ] << 0 );
923
+ length_blocks = (_cbw.CB [6 ] << 24 ) | (_cbw.CB [7 ] << 16 ) | (_cbw.CB [8 ] << 8 ) | (_cbw.CB [9 ] << 0 );
917
924
break ;
918
925
}
919
926
920
- _length = n * _block_size;
927
+ _length = length_blocks * _block_size;
921
928
922
- if (!_cbw.DataLength ) { // host requests no data
929
+ if (!_cbw.DataLength || !length_blocks || (length_blocks > _block_count - addr_block) || (_length > _memory_size - _addr)) { // host requests no data or wrong length
923
930
_csw.Status = CSW_FAILED;
924
931
sendCSW ();
925
932
return false ;
You can’t perform that action at this time.
0 commit comments