@@ -997,6 +997,16 @@ static int hm2_eth_send_queued_reads(hm2_lowlevel_io_t *this) {
997997 hm2_eth_t * board = this -> private ;
998998 int send ;
999999
1000+ size_t read_packet_size = board -> read_packet_ptr - board -> read_packet ;
1001+ if (read_packet_size + 3 * sizeof (lbp16_cmd_addr ) + sizeof (uint32_t ) > sizeof (board -> read_packet )){
1002+ LL_PRINT ("ERROR: send_queued_reads: buffer full, droping data\n" );
1003+ //We need to drop the data to recover
1004+ board -> read_packet_ptr = board -> read_packet ;
1005+ board -> queue_reads_count = 0 ;
1006+ board -> queue_buff_size = 0 ;
1007+ return 0 ;
1008+ }
1009+
10001010 // read (low 16 bits of) last write number from space 4 address 0010
10011011 LBP16_INIT_PACKET4 (* (lbp16_cmd_addr * )(board -> read_packet_ptr ), CMD_READ_COMM_CTRL_ADDR16 (1 ), 0x8 );
10021012 board -> read_packet_ptr += sizeof (lbp16_cmd_addr );
@@ -1139,7 +1149,13 @@ static int hm2_eth_enqueue_read(hm2_lowlevel_io_t *this, rtapi_u32 addr, void *b
11391149 hm2_eth_t * board = this -> private ;
11401150 if (comm_active == 0 ) return 1 ;
11411151 if (size == 0 ) return 1 ;
1142- // XXX this is missing a check for exceeding the maximum packet size!
1152+
1153+ size_t read_packet_size = board -> read_packet_ptr - board -> read_packet ;
1154+ if (read_packet_size + sizeof (lbp16_cmd_addr ) > sizeof (board -> read_packet )){
1155+ LL_PRINT ("ERROR: enqueue_read: buffer full\n" );
1156+ return 0 ;
1157+ }
1158+
11431159 LBP16_INIT_PACKET4 (* (lbp16_cmd_addr * )board -> read_packet_ptr , CMD_READ_HOSTMOT2_ADDR32_INCR (size /4 ), addr );
11441160 board -> read_packet_ptr += sizeof (lbp16_cmd_addr );
11451161 board -> queue_reads [board -> queue_reads_count ].buffer = buffer ;
@@ -1185,8 +1201,16 @@ static int hm2_eth_send_queued_writes(hm2_lowlevel_io_t *this) {
11851201 hm2_eth_t * board = this -> private ;
11861202
11871203 board -> write_cnt ++ ;
1188- // XXX this is missing a check for exceeding the maximum packet size!
11891204 lbp16_cmd_addr * packet = (lbp16_cmd_addr * ) board -> write_packet_ptr ;
1205+
1206+ if (board -> write_packet_size + sizeof (* packet ) + 4 > sizeof (board -> write_packet )){
1207+ LL_PRINT ("ERROR: send_queued_writes: buffer full, droping all data\n" );
1208+ //We need to drop the data to recover
1209+ board -> write_packet_ptr = board -> write_packet ;
1210+ board -> write_packet_size = 0 ;
1211+ return 0 ;
1212+ }
1213+
11901214 LBP16_INIT_PACKET4 (* packet , CMD_WRITE_TIMER_ADDR16_INCR (2 ), 0x14 );
11911215 board -> write_packet_ptr += sizeof (* packet );
11921216 memcpy (board -> write_packet_ptr , & board -> write_cnt , 4 );
@@ -1212,7 +1236,11 @@ static int hm2_eth_enqueue_write(hm2_lowlevel_io_t *this, rtapi_u32 addr, const
12121236 if (size == 0 ) return 1 ;
12131237 lbp16_cmd_addr * packet = (lbp16_cmd_addr * ) board -> write_packet_ptr ;
12141238
1215- // XXX this is missing a check for exceeding the maximum packet size!
1239+ if (board -> write_packet_size + sizeof (* packet ) + size > sizeof (board -> write_packet )){
1240+ LL_PRINT ("ERROR: enqueue_write: buffer full\n" );
1241+ return 0 ;
1242+ }
1243+
12161244 LBP16_INIT_PACKET4_PTR (packet , CMD_WRITE_HOSTMOT2_ADDR32_INCR (size /4 ), addr );
12171245 board -> write_packet_ptr += sizeof (* packet );
12181246 memcpy (board -> write_packet_ptr , buffer , size );
0 commit comments