protocol_splitter: check available bytes before read()

This is to avoid blocking in any case.
If we don't do that, ioctl() may signal data available while the other
protocol does a read(), and when the first protocol tries to do a read(),
it would not have data anymore and would block (so this avoids a race
condition).
This commit is contained in:
Beat Küng
2021-08-22 10:42:13 -04:00
committed by Daniel Agar
parent 5d1e78befb
commit fdb92d4746
@@ -160,9 +160,15 @@ int ReadBuffer::read(int fd)
PX4_DEBUG("Buffer full: %zu %zu %zu %zu", start_mavlink, end_mavlink, start_rtps, end_rtps);
}
int r = ::read(fd, buffer + buf_size, sizeof(buffer) - buf_size);
int bytes_available = 0;
int err = ::ioctl(fd, FIONREAD, (unsigned long)&bytes_available);
ssize_t r = 0;
if (r < 0) {
if (err != 0 || bytes_available > 0) {
r = ::read(fd, buffer + buf_size, sizeof(buffer) - buf_size);
}
if (r <= 0) {
return r;
}