From 7b398453dbe4f2ce9ebe666c4d26fb987991d1a6 Mon Sep 17 00:00:00 2001 From: "Joseph C. Lehner" Date: Tue, 15 Sep 2020 18:53:39 +0200 Subject: [PATCH] Set SO_REUSEADDR on TFTP socket --- tftp.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/tftp.c b/tftp.c index bac02bc..01d96f8 100644 --- a/tftp.c +++ b/tftp.c @@ -331,6 +331,11 @@ int tftp_put(struct nmrpd_args *args) bool rollover; const unsigned rx_timeout = MAX(args->rx_timeout / (args->blind ? 50 : 5), 2000); const unsigned max_timeouts = args->blind ? 3 : 5; +#ifndef NMRPFLASH_WINDOWS + int enabled = 1; +#else + BOOL enabled = TRUE; +#endif sock = -1; ret = -1; @@ -361,27 +366,34 @@ int tftp_put(struct nmrpd_args *args) } #ifndef NMRPFLASH_FUZZ_TFTP - sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { sock_perror("socket"); - ret = sock; goto cleanup; } + + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &enabled, sizeof(enabled)) != 0) { + sock_perror("setsockopt"); + goto cleanup; + } + #else sock = STDIN_FILENO; #endif memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; + // check if we have an interface address, and bind to it if we do if (args->ipaddr_intf) { + addr.sin_addr.s_addr = inet_addr(args->ipaddr_intf); if ((addr.sin_addr.s_addr = inet_addr(args->ipaddr_intf)) == INADDR_NONE) { xperror("inet_addr"); goto cleanup; } if (bind(sock, (struct sockaddr*)&addr, sizeof(addr)) != 0) { + printf("errno=%d\n", errno); sock_perror("bind"); goto cleanup; }