diff options
author | Stefan Hajnoczi <stefanha@gmail.com> | 2010-01-10 19:05:17 +0000 |
---|---|---|
committer | Marty Connor <mdc@etherboot.org> | 2010-01-15 15:54:36 -0500 |
commit | dd99ee95cb513384a13c2be486f684e4a1606ea9 (patch) | |
tree | f3d7a4a42263d0b4f82fa1e32da2aba1bfcb9145 /src | |
parent | 734061e9c60103439e13d72c68e50ee362f3ba91 (diff) | |
download | ipxe-dd99ee95cb513384a13c2be486f684e4a1606ea9.tar.gz |
[tftp] Allow fetching larger files by wrapping block number
This patch adds TFTP support for files larger than 65535 blocks by
wrapping the 16-bit block number.
Reported-by: Mark Johnson <johnson.nh@gmail.com>
Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
Signed-off-by: Marty Connor <mdc@etherboot.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/net/udp/tftp.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/net/udp/tftp.c b/src/net/udp/tftp.c index bb031ecf..82055fcd 100644 --- a/src/net/udp/tftp.c +++ b/src/net/udp/tftp.c @@ -747,7 +747,7 @@ static int tftp_rx_data ( struct tftp_request *tftp, struct io_buffer *iobuf ) { struct tftp_data *data = iobuf->data; struct xfer_metadata meta; - int block; + unsigned int block; off_t offset; size_t data_len; int rc; @@ -759,14 +759,17 @@ static int tftp_rx_data ( struct tftp_request *tftp, rc = -EINVAL; goto done; } - if ( data->block == 0 ) { + + /* Calculate block number */ + block = ( ( bitmap_first_gap ( &tftp->bitmap ) + 1 ) & ~0xffff ); + if ( data->block == 0 && block == 0 ) { DBGC ( tftp, "TFTP %p received data block 0\n", tftp ); rc = -EINVAL; goto done; } + block += ( ntohs ( data->block ) - 1 ); /* Extract data */ - block = ( ntohs ( data->block ) - 1 ); offset = ( block * tftp->blksize ); iob_pull ( iobuf, sizeof ( *data ) ); data_len = iob_len ( iobuf ); |