mirror of
https://github.com/subsurface/subsurface.git
synced 2025-01-19 14:25:27 +00:00
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:
parent
4ee4bbdb58
commit
5e89d81d9d
2 changed files with 13 additions and 18 deletions
|
@ -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
|
Loading…
Add table
Reference in a new issue