[oe] [PATCH meta-networking] atftp: port a patch from OpenSUSE to fix "Sorcerer's Apprentice Syndrome"(SAS)

Rongqing Li rongqing.li at windriver.com
Fri Sep 6 00:16:36 UTC 2013


ping...

Thanks

-Roy


On 08/20/2013 02:57 PM, rongqing.li at windriver.com wrote:
> From: "Roy.Li" <rongqing.li at windriver.com>
>
> Signed-off-by: Roy.Li <rongqing.li at windriver.com>
> ---
>   meta-networking/recipes-daemons/atftp/atftp_git.bb |    1 +
>   .../files/atftp-0.7-sorcerers_apprentice.patch     |   94 ++++++++++++++++++++
>   2 files changed, 95 insertions(+)
>   create mode 100644 meta-networking/recipes-daemons/atftp/files/atftp-0.7-sorcerers_apprentice.patch
>
> diff --git a/meta-networking/recipes-daemons/atftp/atftp_git.bb b/meta-networking/recipes-daemons/atftp/atftp_git.bb
> index 4b9ff05..8f9b4e3 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://atftp.git.sourceforge.net/gitroot/atftp/atftp;protocol=git \
>              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
> +                     {
>

-- 
Best Reagrds,
Roy | RongQing Li



More information about the Openembedded-devel mailing list