forked from pool/atftp
a0ad000cb3
- licence in spdx format - fixed the "Sorcerer's Apprentice Syndrome" bug (bnc#727843) OBS-URL: https://build.opensuse.org/request/show/93259 OBS-URL: https://build.opensuse.org/package/show/network/atftp?expand=0&rev=11
85 lines
3.5 KiB
Diff
85 lines
3.5 KiB
Diff
Index: atftp-0.7/tftp_file.c
|
|
===================================================================
|
|
--- atftp-0.7.orig/tftp_file.c 2011-11-22 15:12:53.792744083 +0100
|
|
+++ atftp-0.7/tftp_file.c 2011-11-22 15:13:51.706421893 +0100
|
|
@@ -605,6 +605,7 @@
|
|
int timeout_state = state; /* what state should we go on when timeout */
|
|
int result;
|
|
long block_number = 0;
|
|
+ long last_requested_block = -1;
|
|
long last_block = -1;
|
|
int data_size; /* size of data received */
|
|
int sockfd = data->sockfd; /* just to simplify calls */
|
|
@@ -765,6 +766,17 @@
|
|
connected = 1;
|
|
}
|
|
block_number = ntohs(tftphdr->th_block);
|
|
+
|
|
+ if (last_requested_block >= block_number)
|
|
+ {
|
|
+ if (data->trace)
|
|
+ fprintf(stderr, "received duplicated ACK <block: %ld >= %ld>\n",
|
|
+ last_requested_block, block_number);
|
|
+ break;
|
|
+ }
|
|
+ else
|
|
+ last_requested_block = block_number;
|
|
+
|
|
if (data->trace)
|
|
fprintf(stderr, "received ACK <block: %ld>\n",
|
|
block_number);
|
|
Index: atftp-0.7/tftpd_file.c
|
|
===================================================================
|
|
--- atftp-0.7.orig/tftpd_file.c 2011-11-22 15:12:53.793744112 +0100
|
|
+++ atftp-0.7/tftpd_file.c 2011-11-22 15:15:04.617534260 +0100
|
|
@@ -403,6 +403,7 @@
|
|
int timeout_state = state;
|
|
int result;
|
|
long block_number = 0;
|
|
+ long last_requested_block = -1;
|
|
long last_block = -1;
|
|
int block_loops = 0;
|
|
int data_size;
|
|
@@ -859,6 +860,32 @@
|
|
{
|
|
logger(LOG_DEBUG, "received ACK <block: %d>", block_number);
|
|
}
|
|
+
|
|
+ /* check whether the block request isn't already fulfilled */
|
|
+
|
|
+ /* multicast, block numbers could contain gaps */
|
|
+ if (multicast) {
|
|
+ if (last_requested_block >= block_number)
|
|
+ {
|
|
+ if (data->trace)
|
|
+ logger(LOG_DEBUG, "received duplicated ACK <block: %d >= %d>", last_requested_block, block_number);
|
|
+ break;
|
|
+ }
|
|
+ else
|
|
+ last_requested_block = block_number;
|
|
+ /* unicast, blocks should be requested one after another */
|
|
+ } else {
|
|
+ if (last_requested_block + 1 != block_number && last_requested_block != -1)
|
|
+ {
|
|
+ if (data->trace)
|
|
+ logger(LOG_DEBUG, "received out of order ACK <block: %d != %d>", last_requested_block + 1, block_number);
|
|
+ break;
|
|
+ }
|
|
+ else
|
|
+ last_requested_block = block_number;
|
|
+ }
|
|
+
|
|
+
|
|
if (ntohs(tftphdr->th_block) == 65535)
|
|
{
|
|
block_loops++;
|
|
@@ -958,6 +985,8 @@
|
|
/* nedd to send an oack to that client */
|
|
state = S_SEND_OACK;
|
|
fseek(fp, 0, SEEK_SET);
|
|
+ /* reset the last block received counter */
|
|
+ last_requested_block = -1;
|
|
}
|
|
else
|
|
{
|