libbb: make bb_lookup_port() abort on bad port names
No binary (build failed)
—
(log yok)
| @@ -115,27 +115,19 @@ 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 |
| + | * If "port" is a name it is looked up in /etc/services. |
| + | * if NULL, 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) |
| { | |
| - | unsigned port_nr = default_port; |
| if (port) { | |
| - | int old_errno; |
| - | |
| - | /* Since this is a lib function, we're not allowed to reset errno to 0. |
| - | * Doing so could break an app that is deferring checking of errno. */ |
| - | old_errno = errno; |
| port_nr = bb_strtou(port, NULL, 10); | |
| if (errno || port_nr > 65535) { | |
| struct servent *tserv = getservbyname(port, protocol); | |
| - | port_nr = default_port; |
| - | if (tserv) |
| - | port_nr = ntohs(tserv->s_port); |
| - | //FIXME: else: port string was garbage, but we don't report that??? |
| + | if (!tserv) |
| + | bb_error_msg_and_die("bad port '%s'", port); |
| + | port_nr = ntohs(tserv->s_port); |
| } | |
| - | errno = old_errno; |
| } | |
| return (uint16_t)port_nr; | |
| } | |
| @@ -290,8 +290,7 @@ static const char ftpgetput_longopts[] ALIGN1 = | |
| int ftpgetput_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| int ftpgetput_main(int argc UNUSED_PARAM, char **argv) | |
| { | |
| - | const char *port = "ftp"; |
| - | /* socket to ftp server */ |
| + | const char *port = NULL; |
| #if ENABLE_FTPPUT && !ENABLE_FTPGET | |
| # define ftp_action ftp_send | |
| @@ -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", 0)); |
| } | |
| } | |
| @@ -813,8 +813,6 @@ int nc_main(int argc UNUSED_PARAM, char **argv) | |
| //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); | |
| - | if (!o_lport) |
| - | bb_error_msg_and_die("bad local port '%s'", str_p); |
| } | |
| //if (option_mask32 & OPT_r) /* randomize various things */ | |
| //if (option_mask32 & OPT_u) /* use UDP */ | |
| @@ -827,9 +825,8 @@ 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", 0) |
| + | ); |
| } | |
| /* create & bind network socket */ | |