diff options
author | Roy.Li <rongqing.li@windriver.com> | 2013-08-20 14:57:37 +0800 |
---|---|---|
committer | Joe MacDonald <joe@deserted.net> | 2013-09-05 09:16:33 -0400 |
commit | 2b5682418cdec33f91e6fc3545e7dfcea57de4c7 (patch) | |
tree | fdbee147ffae668bb495dda8bd2a2a2bd8db7b27 /meta-networking | |
parent | 728254ca47e9bd9bd67b73d192adf8cd59ec1b12 (diff) | |
download | meta-openembedded-contrib-2b5682418cdec33f91e6fc3545e7dfcea57de4c7.tar.gz |
atftp: port a patch from OpenSUSE to fix "Sorcerer's Apprentice Syndrome"(SAS)
Signed-off-by: Roy.Li <rongqing.li@windriver.com>
Signed-off-by: Joe MacDonald <joe@deserted.net>
Diffstat (limited to 'meta-networking')
-rw-r--r-- | meta-networking/recipes-daemons/atftp/atftp_git.bb | 1 | ||||
-rw-r--r-- | meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch | 94 |
2 files changed, 95 insertions, 0 deletions
diff --git a/meta-networking/recipes-daemons/atftp/atftp_git.bb b/meta-networking/recipes-daemons/atftp/atftp_git.bb index 6156bb1c77..ffc0bc8745 100644 --- a/meta-networking/recipes-daemons/atftp/atftp_git.bb +++ b/meta-networking/recipes-daemons/atftp/atftp_git.bb @@ -13,6 +13,7 @@ SRC_URI = "git://git.code.sf.net/p/atftp/code \ file://atftpd-0.7_unprotected_assignments_crash.patch \ file://atftpd.init \ file://atftpd.service \ + file://atftp-0.7-sorcerers_apprentice.patch \ " S = "${WORKDIR}/git" diff --git a/meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch b/meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch new file mode 100644 index 0000000000..fc64291cd3 --- /dev/null +++ b/meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch @@ -0,0 +1,94 @@ +atftp exhibits the well known "Sorcerer's Apprentice Syndrome"(SAS) problem. +According to RFC 1350, the fix to SAS is quite simple: further copies of the +acknowledgment for a particular data block would be ignored. + +Patch originally from OpenSUSE: +https://build.opensuse.org/package/view_file?file=atftp-0.7-sorcerers_apprentice.patch&package=atftp.539&project=openSUSE%3A12.1%3AUpdate&rev=84569792975e00573d7df597d2a6e895 + +Upstream-Status: Pending + +Signed-off-by: Roy.Li <rongqing.li@windriver.com> +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 + { |