net: lwip: tftp: time out if there is no reply from server
authorJerome Forissier <jerome.forissier@linaro.org>
Mon, 28 Apr 2025 09:24:07 +0000 (11:24 +0200)
committerJerome Forissier <jerome.forissier@linaro.org>
Tue, 20 May 2025 13:43:09 +0000 (15:43 +0200)
When there is no reply from the TFTP server, do_tftpb() should
eventually time out. Add a 10 second timer for that purpose.

Reported-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
Signed-off-by: Jerome Forissier <jerome.forissier@linaro.org>
net/lwip/tftp.c

index 162c141..fae701b 100644 (file)
@@ -16,6 +16,8 @@
 #include <time.h>
 
 #define PROGRESS_PRINT_STEP_BYTES (10 * 1024)
+/* Max time to wait for first data packet from server */
+#define NO_RSP_TIMEOUT_MS 10000
 
 enum done_state {
        NOT_DONE = 0,
@@ -140,6 +142,17 @@ static const struct tftp_context tftp_context = {
        tftp_error
 };
 
+static void no_response(void *arg)
+{
+       struct tftp_ctx *ctx = (struct tftp_ctx *)arg;
+
+       if (ctx->size)
+               return;
+
+       printf("Timeout!\n");
+       ctx->done = FAILURE;
+}
+
 static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
                     ip_addr_t srvip, uint16_t srvport)
 {
@@ -184,6 +197,7 @@ static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
                return -1;
        }
 
+       sys_timeout(NO_RSP_TIMEOUT_MS, no_response, &ctx);
        while (!ctx.done) {
                net_lwip_rx(udev, netif);
                sys_check_timeouts();
@@ -193,6 +207,7 @@ static int tftp_loop(struct udevice *udev, ulong addr, char *fname,
                        break;
                }
        }
+       sys_untimeout(no_response, (void *)&ctx);
 
        tftp_cleanup();