[oe-commits] Roy.Li : atftp: port a patch from OpenSUSE to fix "Sorcerer' s Apprentice Syndrome"(SAS)

git at git.openembedded.org git at git.openembedded.org
Thu Sep 5 13:17:24 UTC 2013


Module: meta-openembedded.git
Branch: master
Commit: 2b5682418cdec33f91e6fc3545e7dfcea57de4c7
URL:    http://git.openembedded.org/?p=meta-openembedded.git&a=commit;h=2b5682418cdec33f91e6fc3545e7dfcea57de4c7

Author: Roy.Li <rongqing.li at windriver.com>
Date:   Tue Aug 20 14:57:37 2013 +0800

atftp: port a patch from OpenSUSE to fix "Sorcerer's Apprentice Syndrome"(SAS)

Signed-off-by: Roy.Li <rongqing.li at windriver.com>
Signed-off-by: Joe MacDonald <joe at deserted.net>

---

 meta-networking/recipes-daemons/atftp/atftp_git.bb |    1 +
 .../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 6156bb1..ffc0bc8 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 0000000..fc64291
--- /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 at 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
+                     {



More information about the Openembedded-commits mailing list