Переглянути джерело

[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>
tags/v1.0.0-rc1
Stefan Hajnoczi 14 роки тому
джерело
коміт
dd99ee95cb
1 змінених файлів з 6 додано та 3 видалено
  1. 6
    3
      src/net/udp/tftp.c

+ 6
- 3
src/net/udp/tftp.c Переглянути файл

747
 			  struct io_buffer *iobuf ) {
747
 			  struct io_buffer *iobuf ) {
748
 	struct tftp_data *data = iobuf->data;
748
 	struct tftp_data *data = iobuf->data;
749
 	struct xfer_metadata meta;
749
 	struct xfer_metadata meta;
750
-	int block;
750
+	unsigned int block;
751
 	off_t offset;
751
 	off_t offset;
752
 	size_t data_len;
752
 	size_t data_len;
753
 	int rc;
753
 	int rc;
759
 		rc = -EINVAL;
759
 		rc = -EINVAL;
760
 		goto done;
760
 		goto done;
761
 	}
761
 	}
762
-	if ( data->block == 0 ) {
762
+
763
+	/* Calculate block number */
764
+	block = ( ( bitmap_first_gap ( &tftp->bitmap ) + 1 ) & ~0xffff );
765
+	if ( data->block == 0 && block == 0 ) {
763
 		DBGC ( tftp, "TFTP %p received data block 0\n", tftp );
766
 		DBGC ( tftp, "TFTP %p received data block 0\n", tftp );
764
 		rc = -EINVAL;
767
 		rc = -EINVAL;
765
 		goto done;
768
 		goto done;
766
 	}
769
 	}
770
+	block += ( ntohs ( data->block ) - 1 );
767
 
771
 
768
 	/* Extract data */
772
 	/* Extract data */
769
-	block = ( ntohs ( data->block ) - 1 );
770
 	offset = ( block * tftp->blksize );
773
 	offset = ( block * tftp->blksize );
771
 	iob_pull ( iobuf, sizeof ( *data ) );
774
 	iob_pull ( iobuf, sizeof ( *data ) );
772
 	data_len = iob_len ( iobuf );
775
 	data_len = iob_len ( iobuf );

Завантаження…
Відмінити
Зберегти