summaryrefslogtreecommitdiffstats
path: root/daemon/device.c
diff options
context:
space:
mode:
authorGravatar Hector Martin2010-05-11 00:34:33 +0200
committerGravatar Hector Martin2010-05-11 00:34:33 +0200
commit4c3d762fd6da36cfe877506b74820850eef9f706 (patch)
treea7cac31c05522ce44dc3b83fada8394f64762b39 /daemon/device.c
parentd54bf6f008e90686b2bc1b38b8d93f0ff4a770e7 (diff)
downloadusbmuxd-4c3d762fd6da36cfe877506b74820850eef9f706.tar.gz
usbmuxd-4c3d762fd6da36cfe877506b74820850eef9f706.tar.bz2
Fix aborts due to transmit window overflow
c0b02222 made conn->sendable unsigned. If the device reduces the window after we've sent too much data already, it can become negative, overflow, and cause connection aborts when we send too much data. Fix this by checking for this condition and setting conn->sendable to 0. Thanks to Thomas Jost and Nikias Bassen for debugging this issue.
Diffstat (limited to 'daemon/device.c')
-rw-r--r--daemon/device.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/daemon/device.c b/daemon/device.c
index acedbdf..684e009 100644
--- a/daemon/device.c
+++ b/daemon/device.c
@@ -322,7 +322,12 @@ int device_start_connect(int device_id, uint16_t dport, struct mux_client *clien
static void update_connection(struct mux_connection *conn)
{
- conn->sendable = conn->rx_win - (conn->tx_seq - conn->rx_ack);
+ uint32_t sent = conn->tx_seq - conn->rx_ack;
+
+ if(conn->rx_win > sent)
+ conn->sendable = conn->rx_win - sent;
+ else
+ conn->sendable = 0;
if(conn->sendable > conn->ob_capacity)
conn->sendable = conn->ob_capacity;