summaryrefslogtreecommitdiffstats
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
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.
-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;