Skip to content

Commit 57589d0

Browse files
authored
fix ooo ack bug - fixes near-infinite loop where an ack arrives that is less than stream->remote_acked, ie a higher ack has already arrived. (holepunchto#255)
1 parent e504eb4 commit 57589d0

1 file changed

Lines changed: 5 additions & 3 deletions

File tree

src/udx.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,7 +1250,7 @@ process_packet (udx_socket_t *socket, char *buf, ssize_t buf_len, struct sockadd
12501250
uint32_t delivered = stream->delivered;
12511251
uint32_t lost = stream->lost;
12521252
uint32_t prior_remote_acked = stream->remote_acked;
1253-
bool ack_advanced = ack > prior_remote_acked;
1253+
bool ack_advanced = seq_diff(ack, prior_remote_acked) > 0;
12541254

12551255
buf += UDX_HEADER_SIZE;
12561256
buf_len -= UDX_HEADER_SIZE;
@@ -1364,7 +1364,7 @@ process_packet (udx_socket_t *socket, char *buf, ssize_t buf_len, struct sockadd
13641364

13651365
udx_rate_sample_t rs;
13661366

1367-
for (uint32_t p = prior_remote_acked; p != ack; p++) {
1367+
for (uint32_t p = prior_remote_acked; seq_diff(p, ack) < 0; p++) {
13681368
int a = ack_packet(stream, p, 0, &rs);
13691369
if (a == 1) stream->delivered++;
13701370
if (a == 2) {
@@ -1373,7 +1373,9 @@ process_packet (udx_socket_t *socket, char *buf, ssize_t buf_len, struct sockadd
13731373
}
13741374
}
13751375

1376-
stream->remote_acked = ack;
1376+
if (ack_advanced) {
1377+
stream->remote_acked = ack;
1378+
}
13771379

13781380
if (ended) {
13791381
if (stream->status & UDX_STREAM_DEAD) {

0 commit comments

Comments
 (0)