libc_integration: fix out-of-bound access

which leads to sporadic pagefaults/segmentation faults.

Fixes #3967
This commit is contained in:
Alexander Boettcher 2021-05-11 16:27:36 +02:00 committed by Christian Helmuth
parent 139a2cfae9
commit f8d0552d52
2 changed files with 11 additions and 3 deletions

View File

@ -30,7 +30,7 @@ if { [get_cmd_switch --autopilot] } {
set run [expr [have_spec nova] || [have_spec hw]]
}
if {[have_board imx8q_evk]} {
set config_wo 10000
set config_wo 9000
set run 1
}
if {[have_board linux]} {

View File

@ -66,8 +66,14 @@ void *worker_func(void *ptr)
data_out.push_back(buf[random()%r_res]);
}
if (data_out.size() < bytes_written) {
error("error: worker ", work_info.worker_no, " unexpected state");
exit(-8);
}
/* write part of response */
size_t cnt { min(static_cast<size_t>(work_info.buffer_size), work_info.num_bytes-bytes_written) };
size_t cnt { min(static_cast<size_t>(work_info.buffer_size),
data_out.size() - bytes_written) };
ssize_t w_res { write(work_info.pipe_out_fd,
data_out.data()+bytes_written,
cnt) };
@ -103,7 +109,9 @@ void *worker_func(void *ptr)
/* write remaining output bytes */
while (bytes_written < data_out.size()) {
size_t cnt { min(static_cast<size_t>(work_info.buffer_size), work_info.num_bytes-bytes_written) };
size_t cnt { min(static_cast<size_t>(work_info.buffer_size),
data_out.size() - bytes_written) };
ssize_t w_res { write(work_info.pipe_out_fd,
data_out.data()+bytes_written, cnt) };