From 5e89d81d9d6b8b1101b1482620b3f85968eb3b47 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 13 Mar 2020 12:57:15 -0700 Subject: iostream: fix incorrect rfcomm error case when writing This is the exact same case as the previous commit, just for the writing side. Once again, it's the subsurface rfcomm iostream code that can return DC_STATUS_SUCCESS with a byte count of zero when something goes wrong with the write. And once again, our libdivecomputer iostream code didn't try to be robust and protect itself from that case. The fix is equivalent, although slightly simpler, since the write side doesn't have the whole timeout issue. Signed-off-by: Linus Torvalds --- core/qtserialbluetooth.cpp | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) (limited to 'core/qtserialbluetooth.cpp') diff --git a/core/qtserialbluetooth.cpp b/core/qtserialbluetooth.cpp index f6bbcafdf..1c0270ff9 100644 --- a/core/qtserialbluetooth.cpp +++ b/core/qtserialbluetooth.cpp @@ -172,32 +172,27 @@ static dc_status_t qt_serial_write(void *io, const void* data, size_t size, size { qt_serial_t *device = (qt_serial_t*) io; - if (device == NULL || device->socket == NULL) + if (device == NULL || device->socket == NULL || !actual) return DC_STATUS_INVALIDARGS; - size_t nbytes = 0; - int rc; + *actual = 0; + for (;;) { + int rc; + + if (device->socket->state() != QBluetoothSocket::ConnectedState) + return DC_STATUS_IO; - while(nbytes < size && device->socket->state() == QBluetoothSocket::ConnectedState) - { - rc = device->socket->write((char *) data + nbytes, size - nbytes); + rc = device->socket->write((char *) data, size); if (rc < 0) { if (errno == EINTR || errno == EAGAIN) - continue; // Retry. - - return DC_STATUS_IO; // Something really bad happened :-( - } else if (rc == 0) { - break; + continue; + return DC_STATUS_IO; } - nbytes += rc; + *actual = rc; + return rc ? DC_STATUS_SUCCESS : DC_STATUS_IO; } - - if (actual) - *actual = nbytes; - - return DC_STATUS_SUCCESS; } static dc_status_t qt_serial_poll(void *io, int timeout) -- cgit v1.2.3-70-g09d2