svn commit: r226580 - stable/7/libexec/tftpd
Sean Bruno
sbruno at FreeBSD.org
Thu Oct 20 19:23:22 UTC 2011
Author: sbruno
Date: Thu Oct 20 19:23:21 2011
New Revision: 226580
URL: http://svn.freebsd.org/changeset/base/226580
Log:
MFC r224536:
Confirmed behavior of a Cisco 6509 in production.
In the old TFTP server, there was an undocumented behavior where
the block counter would rollover to 0 if a file larger
than 65535 blocks was transferred. With the default block size
of 512 octets per block, this is a file size of approximately 32 megabytes.
The new TFTP server code would report an error and stop transferring
the file if a file was larger than 65535 blocks.
This patch restores the old TFTP server's behavior to the new
TFTP server code. If a TFTP client transfers a file larger
than 65535 blocks, and does *not* specify the "rollover" option,
then automatically rollover the block counter to 0 every time
we reach 65535 blocks.
This restores interoperability with the FreeBSD 6 TFTP client.
Without this change, if a FreeBSD 6 TFTP client tried to
retrieve a file larger than 65535 blocks from a FreeBSD 9 TFTP server
, the transfer would fail.
The same file could be retrieved successfully if the same FreeBSD 6
TFTP client was used against a FreeBSD 6 TFTP server.
Approved by: re (kib)
Tested by: Pawan Gupta <pawang at juniper dot net>,
Obtained from: Juniper Networks
FreeBSD7 Reviewed by: Yahoo Inc.
> Submitted by: If someone else sent in the change.
> Reviewed by: If someone else reviewed your modification.
> Approved by: If you needed approval for this commit.
> Obtained from: If the change is from a third party.
> MFC after: N [day[s]|week[s]|month[s]]. Request a reminder email.
> Security: Vulnerability reference (one per line) or description.
> Empty fields above will be automatically removed.
M tftpd/tftp-transfer.c
Modified:
stable/7/libexec/tftpd/tftp-transfer.c
Modified: stable/7/libexec/tftpd/tftp-transfer.c
==============================================================================
--- stable/7/libexec/tftpd/tftp-transfer.c Thu Oct 20 19:16:52 2011 (r226579)
+++ stable/7/libexec/tftpd/tftp-transfer.c Thu Oct 20 19:23:21 2011 (r226580)
@@ -129,14 +129,16 @@ tftp_send(int peer, uint16_t *block, str
(*block)++;
if (oldblock > *block) {
if (options[OPT_ROLLOVER].o_request == NULL) {
- tftp_log(LOG_ERR,
- "Block rollover but not allowed.");
- send_error(peer, EBADOP);
- gettimeofday(&(ts->tstop), NULL);
- return;
+ /*
+ * "rollover" option not specified in
+ * tftp client. Default to rolling block
+ * counter to 0.
+ */
+ *block = 0;
+ } else {
+ *block = atoi(options[OPT_ROLLOVER].o_request);
}
- *block = atoi(options[OPT_ROLLOVER].o_request);
ts->rollovers++;
}
gettimeofday(&(ts->tstop), NULL);
@@ -196,14 +198,16 @@ tftp_receive(int peer, uint16_t *block,
(*block)++;
if (oldblock > *block) {
if (options[OPT_ROLLOVER].o_request == NULL) {
- tftp_log(LOG_ERR,
- "Block rollover but not allowed.");
- send_error(peer, EBADOP);
- gettimeofday(&(ts->tstop), NULL);
- return;
+ /*
+ * "rollover" option not specified in
+ * tftp client. Default to rolling block
+ * counter to 0.
+ */
+ *block = 0;
+ } else {
+ *block = atoi(options[OPT_ROLLOVER].o_request);
}
- *block = atoi(options[OPT_ROLLOVER].o_request);
ts->rollovers++;
}
More information about the svn-src-stable
mailing list