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>
