[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH 4/4] bb_lookup_port(): return 0 if lookup failed
From:       Sergey Ponomarev <stokito () gmail ! com>
Date:       2021-08-25 20:12:40
Message-ID: 20210825201240.98752-4-stokito () gmail ! com
[Download RAW message or body]

Unlike xatou16() the bb_lookup_port() won't exit program if port parsing is failed.
But it may return a default_port instead. This is not safe because user requested another port.
Instead, we return 0 and caller may gracefully show a message or just pass it further.
Since the default_port is always zero we may remove the param

Signed-off-by: Sergey Ponomarev <stokito@gmail.com>
---
 include/libbb.h        |  9 +++++++--
 libbb/xconnect.c       | 11 +++--------
 networking/nc.c        |  4 ++--
 networking/nc_bloaty.c |  6 ++----
 networking/tcpudp.c    |  2 +-
 networking/telnet.c    |  2 +-
 6 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/include/libbb.h b/include/libbb.h
index e000ed8b0..62125b36e 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -720,8 +720,13 @@ int setsockopt_keepalive(int fd) FAST_FUNC;
 int setsockopt_broadcast(int fd) FAST_FUNC;
 int setsockopt_bindtodevice(int fd, const char *iface) FAST_FUNC;
 int bb_getsockname(int sockfd, void *addr, socklen_t addrlen) FAST_FUNC;
-/* NB: returns port in host byte order */
-unsigned bb_lookup_port(const char *port, const char *protocol, unsigned default_port) FAST_FUNC;
+/* Resolve port by its number or a service name.
+ * If "port" is a number use it as the port.
+ * If "port" is a name it is looked up in /etc/services,
+ * If it isn't found by a service name return 0
+ * NB: Returns port in host byte order.
+ */
+unsigned bb_lookup_port(const char *port, const char *protocol) FAST_FUNC;
 typedef struct len_and_sockaddr {
 	socklen_t len;
 	union {
diff --git a/libbb/xconnect.c b/libbb/xconnect.c
index 5dd9cfd28..5ae642db8 100644
--- a/libbb/xconnect.c
+++ b/libbb/xconnect.c
@@ -113,14 +113,9 @@ void FAST_FUNC xconnect(int s, const struct sockaddr *s_addr, socklen_t addrlen)
 	}
 }
 
-/* Return port number for a service.
- * If "port" is a number use it as the port.
- * If "port" is a name it is looked up in /etc/services,
- * if it isnt found return default_port
- */
-unsigned FAST_FUNC bb_lookup_port(const char *port, const char *protocol, unsigned default_port)
+unsigned FAST_FUNC bb_lookup_port(const char *port, const char *protocol)
 {
-	unsigned port_nr = default_port;
+	unsigned port_nr = 0;
 	if (port) {
 		int old_errno;
 
@@ -130,7 +125,7 @@ unsigned FAST_FUNC bb_lookup_port(const char *port, const char *protocol, unsign
 		port_nr = bb_strtou(port, NULL, 10);
 		if (errno || port_nr > 65535) {
 			struct servent *tserv = getservbyname(port, protocol);
-			port_nr = default_port;
+			port_nr = 0;
 			if (tserv)
 				port_nr = ntohs(tserv->s_port);
 //FIXME: else: port string was garbage, but we don't report that???
diff --git a/networking/nc.c b/networking/nc.c
index 705b7356a..cb7b813db 100644
--- a/networking/nc.c
+++ b/networking/nc.c
@@ -139,7 +139,7 @@ int nc_main(int argc, char **argv)
 			if (ENABLE_NC_SERVER && opt == 'l')
 				IF_NC_SERVER(do_listen++);
 			else if (ENABLE_NC_SERVER && opt == 'p')
-				IF_NC_SERVER(lport = bb_lookup_port(optarg, "tcp", 0));
+				IF_NC_SERVER(lport = bb_lookup_port(optarg, "tcp"));
 			else if (ENABLE_NC_EXTRA && opt == 'w')
 				IF_NC_EXTRA( wsecs = xatou(optarg));
 			else if (ENABLE_NC_EXTRA && opt == 'i')
@@ -216,7 +216,7 @@ int nc_main(int argc, char **argv)
 				close(sfd);
 		} else {
 			cfd = create_and_connect_stream_or_die(argv[0],
-				argv[1] ? bb_lookup_port(argv[1], "tcp", 0) : 0);
+				bb_lookup_port(argv[1], "tcp"));
 		}
 	}
 
diff --git a/networking/nc_bloaty.c b/networking/nc_bloaty.c
index 25b95246f..f9e06b01d 100644
--- a/networking/nc_bloaty.c
+++ b/networking/nc_bloaty.c
@@ -812,7 +812,7 @@ int nc_main(int argc UNUSED_PARAM, char **argv)
 	//if (option_mask32 & OPT_n) /* numeric-only, no DNS lookups */
 	//if (option_mask32 & OPT_o) /* hexdump log */
 	if (option_mask32 & OPT_p) { /* local source port */
-		o_lport = bb_lookup_port(str_p, o_udpmode ? "udp" : "tcp", 0);
+		o_lport = bb_lookup_port(str_p, o_udpmode ? "udp" : "tcp");
 		if (!o_lport)
 			bb_error_msg_and_die("bad local port '%s'", str_p);
 	}
@@ -827,9 +827,7 @@ int nc_main(int argc UNUSED_PARAM, char **argv)
 
 	if (argv[0]) {
 		themaddr = xhost2sockaddr(argv[0],
-			argv[1]
-			? bb_lookup_port(argv[1], o_udpmode ? "udp" : "tcp", 0)
-			: 0);
+			bb_lookup_port(argv[1], o_udpmode ? "udp" : "tcp"));
 	}
 
 	/* create & bind network socket */
diff --git a/networking/tcpudp.c b/networking/tcpudp.c
index 708e05c2e..abfefc0d2 100644
--- a/networking/tcpudp.c
+++ b/networking/tcpudp.c
@@ -363,7 +363,7 @@ int tcpudpsvd_main(int argc UNUSED_PARAM, char **argv)
 	if (max_per_host)
 		G.cc = ipsvd_perhost_init(cmax);
 
-	local_port = bb_lookup_port(argv[1], tcp ? "tcp" : "udp", 0);
+	local_port = bb_lookup_port(argv[1], tcp ? "tcp" : "udp");
 	lsa = xhost2sockaddr(argv[0], local_port);
 	argv += 2;
 
diff --git a/networking/telnet.c b/networking/telnet.c
index dc088721b..ed7ee5ec5 100644
--- a/networking/telnet.c
+++ b/networking/telnet.c
@@ -649,7 +649,7 @@ int telnet_main(int argc UNUSED_PARAM, char **argv)
 	if (!*argv)
 		bb_show_usage();
 	host = *argv++;
-	port = *argv ? bb_lookup_port(*argv++, "tcp", 23) : 23;
+	port = *argv ? bb_lookup_port(*argv++, "tcp") : 23;
 	if (*argv) /* extra params?? */
 		bb_show_usage();
 
-- 
2.30.2

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic