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 <torvalds@linux-foundation.org>
This commit is contained in:
Linus Torvalds 2020-03-13 12:57:15 -07:00 committed by Dirk Hohndel
parent 4ee4bbdb58
commit 5e89d81d9d
2 changed files with 13 additions and 18 deletions

View file

@ -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;
while(nbytes < size && device->socket->state() == QBluetoothSocket::ConnectedState)
{
rc = device->socket->write((char *) data + nbytes, size - nbytes);
if (device->socket->state() != QBluetoothSocket::ConnectedState)
return DC_STATUS_IO;
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)

@ -1 +1 @@
Subproject commit b77e7b6b217860e166081f8a93fb8bac81797897
Subproject commit 7882ba423cd87569f9c9361fa999917e9ced1083