Skip to content

Commit ee7b7b6

Browse files
Hannes Diethelmhdiethelm
authored andcommitted
hm2_eth: read / write buffer checks
This generated a segfault when eth_socket_send() fails due to accumulating data in the buffer.
1 parent 78817f3 commit ee7b7b6

1 file changed

Lines changed: 31 additions & 3 deletions

File tree

src/hal/drivers/mesa-hostmot2/hm2_eth.c

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)