From 25b0134d1498f3b235d564b2eec5998d69cd0324 Mon Sep 17 00:00:00 2001 From: Wolfram Sang Date: Wed, 4 Apr 2012 18:04:43 +0200 Subject: [PATCH] net: tftp: do not retry endlessly Signed-off-by: Wolfram Sang Signed-off-by: Sascha Hauer --- net/tftp.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/net/tftp.c b/net/tftp.c index 243ad0a96..fc33c9458 100644 --- a/net/tftp.c +++ b/net/tftp.c @@ -39,6 +39,7 @@ static unsigned int tftp_last_block; /* last packet sequence number received */ static int tftp_state; static uint64_t tftp_timer_start; static int tftp_err; +static unsigned tftp_retries; #define STATE_RRQ 1 #define STATE_WRQ 2 @@ -106,6 +107,7 @@ static int tftp_send(void) } tftp_last_block = tftp_block; + tftp_retries = 0; s = (uint16_t *)pkt; *s++ = htons(TFTP_DATA); *s++ = htons(tftp_block); @@ -231,6 +233,7 @@ static void tftp_handler(void *ctx, char *packet, unsigned len) break; tftp_last_block = tftp_block; + tftp_retries = 0; if (!(tftp_block % 10)) tftp_size++; @@ -278,6 +281,7 @@ static int do_tftpb(int argc, char *argv[]) do_tftp_push(0); tftp_last_block = 0; tftp_size = 0; + tftp_retries = 0; while((opt = getopt(argc, argv, "p")) > 0) { switch(opt) { @@ -348,6 +352,12 @@ static int do_tftpb(int argc, char *argv[]) tftp_err = tftp_send(); if (tftp_err) goto out_unreg; + tftp_retries++; + } + + if (tftp_retries > PKT_NUM_RETRIES) { + tftp_err = -ETIMEDOUT; + break; } } out_unreg: