boot - Handle tftp block overflows
authorMatthew Dillon <dillon@apollo.backplane.com>
Fri, 2 Nov 2018 02:06:14 +0000 (19:06 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Fri, 2 Nov 2018 02:11:46 +0000 (19:11 -0700)
* Properly truncate the block number when comparing against the
  incoming packet.  TFTP only implements 16-bit block numbers.
  This allows the boot loader to access files larger than 32MB
  via TFTP.

* Twiddle every 256 reads instead of every 16.

* Note that TFTP is not really a suitable protocol for loading the
  kernel because the ELF loader seeks past the debug info which
  can be well over a hundred megabytes in order to get to the syms.
  NFS is preferred.

lib/libstand/tftp.c

index c4a1947..85faa11 100644 (file)
@@ -146,7 +146,7 @@ recvtftp(struct iodesc *d, void *pkt, size_t max_len, time_t tleft)
        case DATA: {
                int got;
 
-               if (htons(t->th_block) != d->xid) {
+               if (htons(t->th_block) != (uint16_t)d->xid) {
                        /*
                         * Expected block?
                         */
@@ -324,7 +324,7 @@ tftp_read(struct open_file *f, void *addr, size_t size, size_t *resid)
        while (size > 0) {
                int needblock, count;
 
-               if (!(tc++ % 16))
+               if (!(tc++ % 256))
                        twiddle();
 
                needblock = tftpfile->off / SEGSIZE + 1;