diff options
Diffstat (limited to 'net/tftp.c')
-rw-r--r-- | net/tftp.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/tftp.c b/net/tftp.c index c780c33f379..88e71e67de3 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -593,6 +593,14 @@ static void tftp_handler(uchar *pkt, unsigned dest, struct in_addr sip, ntohs(*(__be16 *)pkt), (ushort)(tftp_cur_block + 1)); /* + * Only ACK if the block count received is greater than + * the expected block count, otherwise skip ACK. + * (required to properly handle the server retransmitting + * the window) + */ + if ((ushort)(tftp_cur_block + 1) - (short)(ntohs(*(__be16 *)pkt)) > 0) + break; + /* * If one packet is dropped most likely * all other buffers in the window * that will arrive will cause a sending NACK. @@ -837,7 +845,7 @@ void tftp_start(enum proto_t protocol) e = strchr(net_boot_file_name, ']'); len = e - s; if (s && e) { - string_to_ip6(s + 1, len, &tftp_remote_ip6); + string_to_ip6(s + 1, len - 1, &tftp_remote_ip6); strlcpy(tftp_filename, e + 2, MAX_LEN); } else { strlcpy(tftp_filename, net_boot_file_name, MAX_LEN); |