Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 22 May 2026 17:58:07 +0000
From:      Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav <des@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 47e4571df158 - main - tftp: Fix handling of port name or number
Message-ID:  <6a10992f.37579.3f873412@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=47e4571df15804fe2b010a3c82b22691d80ee680

commit 47e4571df15804fe2b010a3c82b22691d80ee680
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2026-05-22 17:57:16 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2026-05-22 17:57:16 +0000

    tftp: Fix handling of port name or number
    
    MFC after:      1 week
    Reviewed by:    markj
    Differential Revision:  https://reviews.freebsd.org/D57105
---
 usr.bin/tftp/main.c |  7 ++++---
 usr.bin/tftp/tftp.c | 40 ++++++++++++++++++++++------------------
 2 files changed, 26 insertions(+), 21 deletions(-)

diff --git a/usr.bin/tftp/main.c b/usr.bin/tftp/main.c
index a26561eaa982..02a84f864071 100644
--- a/usr.bin/tftp/main.c
+++ b/usr.bin/tftp/main.c
@@ -331,6 +331,8 @@ setpeer0(char *host, const char *lport)
 	}
 
 	freeaddrinfo(res0);
+	free(port);
+	port = strdup(lport);
 }
 
 static void
@@ -350,10 +352,9 @@ setpeer(int argc, char *argv[])
 		printf("usage: %s [host [port]]\n", argv[0]);
 		return;
 	}
-	if (argc == 3) {
-		port = argv[2];
+	if (argc == 3)
 		setpeer0(argv[1], argv[2]);
-	} else
+	else
 		setpeer0(argv[1], NULL);
 }
 
diff --git a/usr.bin/tftp/tftp.c b/usr.bin/tftp/tftp.c
index 31a22f416135..e5c307a572fb 100644
--- a/usr.bin/tftp/tftp.c
+++ b/usr.bin/tftp/tftp.c
@@ -64,8 +64,9 @@ int
 xmitfile(int peer, char *port, int fd, char *name, char *mode)
 {
 	struct tftphdr *rp;
+	struct servent *se;
 	int n, i, ret = 0;
-	uint16_t block;
+	uint16_t block, portn;
 	struct sockaddr_storage serv;	/* valid server port number */
 	char recvbuffer[MAXPKTSIZE];
 	struct tftp_stats tftp_stats;
@@ -75,14 +76,15 @@ xmitfile(int peer, char *port, int fd, char *name, char *mode)
 	memset(&serv, 0, sizeof(serv));
 	rp = (struct tftphdr *)recvbuffer;
 
-	if (port == NULL) {
-		struct servent *se;
-		se = getservbyname("tftp", "udp");
-		assert(se != NULL);
-		((struct sockaddr_in *)&peer_sock)->sin_port = se->s_port;
-	} else
-		((struct sockaddr_in *)&peer_sock)->sin_port =
-		    htons(atoi(port));
+	if ((se = getservbyname(port ? port : "tftp", "udp")) != NULL)
+		portn = se->s_port;
+	else
+		portn = htons(atoi(port));
+	if (portn == 0) {
+		printf("Invalid port '%s'.\n", port ? port : "tftp");
+		return -1;
+	}
+	((struct sockaddr_in *)&peer_sock)->sin_port = portn;
 
 	for (i = 0; i < 12; i++) {
 		struct sockaddr_storage from;
@@ -166,7 +168,8 @@ int
 recvfile(int peer, char *port, int fd, char *name, char *mode)
 {
 	struct tftphdr *rp;
-	uint16_t block;
+	struct servent *se;
+	uint16_t block, portn;
 	char recvbuffer[MAXPKTSIZE];
 	int n, i, ret = 0;
 	struct tftp_stats tftp_stats;
@@ -175,14 +178,15 @@ recvfile(int peer, char *port, int fd, char *name, char *mode)
 
 	rp = (struct tftphdr *)recvbuffer;
 
-	if (port == NULL) {
-		struct servent *se;
-		se = getservbyname("tftp", "udp");
-		assert(se != NULL);
-		((struct sockaddr_in *)&peer_sock)->sin_port = se->s_port;
-	} else
-		((struct sockaddr_in *)&peer_sock)->sin_port =
-		    htons(atoi(port));
+	if ((se = getservbyname(port ? port : "tftp", "udp")) != NULL)
+		portn = se->s_port;
+	else
+		portn = htons(atoi(port));
+	if (portn == 0) {
+		printf("Invalid port '%s'.\n", port ? port : "tftp");
+		return (-1);
+	}
+	((struct sockaddr_in *)&peer_sock)->sin_port = portn;
 
 	for (i = 0; i < 12; i++) {
 		struct sockaddr_storage from;


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a10992f.37579.3f873412>