Fix the Sorcerer's Apprentice bug in both the client and the server.

This commit is contained in:
hpa 2001-11-13 04:16:12 +00:00
parent a58b9604c5
commit d2206bf9b9
3 changed files with 16 additions and 8 deletions

View file

@ -1,5 +1,10 @@
$Id$ $Id$
Changes in 0.25:
Fixed Sorcerer's Apprentice bug in both the client and the
server. These bugs were inherited from the original BSD code.
Changes in 0.24: Changes in 0.24:
Fix bugs in both client and server dealing with block number Fix bugs in both client and server dealing with block number
wraparound, usually manifesting themselves as failure to wraparound, usually manifesting themselves as failure to

View file

@ -137,7 +137,7 @@ tftp_sendfile(int fd, char *name, char *mode)
} }
timeout = 0; timeout = 0;
(void) sigsetjmp(timeoutbuf,1); (void) sigsetjmp(timeoutbuf,1);
send_data:
if (trace) if (trace)
tpacket("sent", dp, size + 4); tpacket("sent", dp, size + 4);
n = sendto(f, dp, size + 4, 0, n = sendto(f, dp, size + 4, 0,
@ -184,9 +184,11 @@ send_data:
printf("discarded %d packets\n", printf("discarded %d packets\n",
j); j);
} }
if (ap->th_block == (block-1)) { /*
goto send_data; * RFC1129/RFC1350: We MUST NOT re-send the DATA
} * packet in response to an invalid ACK. Doing so
* would cause the Sorcerer's Apprentice bug.
*/
} }
} }
if ( !is_request ) if ( !is_request )

View file

@ -978,7 +978,6 @@ tftp_sendfile(struct formats *pf, struct tftphdr *oap, int oacklen)
timeout = 0; timeout = 0;
(void) sigsetjmp(timeoutbuf,1); (void) sigsetjmp(timeoutbuf,1);
send_data:
if (send(peer, dp, size + 4, 0) != size + 4) { if (send(peer, dp, size + 4, 0) != size + 4) {
syslog(LOG_ERR, "tftpd: write: %m"); syslog(LOG_ERR, "tftpd: write: %m");
goto abort; goto abort;
@ -1005,9 +1004,11 @@ tftp_sendfile(struct formats *pf, struct tftphdr *oap, int oacklen)
} }
/* Re-synchronize with the other side */ /* Re-synchronize with the other side */
(void) synchnet(peer); (void) synchnet(peer);
if (ap->th_block == (block -1)) { /*
goto send_data; * RFC1129/RFC1350: We MUST NOT re-send the DATA
} * packet in response to an invalid ACK. Doing so
* would cause the Sorcerer's Apprentice bug.
*/
} }
} }