diff options
author | Hector Martin | 2010-05-11 00:34:33 +0200 |
---|---|---|
committer | Hector Martin | 2010-05-11 00:34:33 +0200 |
commit | 4c3d762fd6da36cfe877506b74820850eef9f706 (patch) | |
tree | a7cac31c05522ce44dc3b83fada8394f64762b39 /daemon/device.c | |
parent | d54bf6f008e90686b2bc1b38b8d93f0ff4a770e7 (diff) | |
download | usbmuxd-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.c | 7 |
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; |