From 40b65c54f284d54c057c25001d83bb3dbee9d7f4 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 27 Dec 2017 17:02:36 +0100 Subject: [PATCH] socket-util: use parse_ip_port() for parsing IP ports Let's unify some code here, and also use parse_ip_port() for all our IP port parsing needs in socket_address_parse(). --- src/basic/socket-util.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index c89e5c8c7..c170e7432 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -79,6 +79,8 @@ int socket_address_parse(SocketAddress *a, const char *s) { a->type = SOCK_STREAM; if (*s == '[') { + uint16_t port; + /* IPv6 in [x:.....:z]:p notation */ e = strchr(s+1, ']'); @@ -97,6 +99,7 @@ int socket_address_parse(SocketAddress *a, const char *s) { e++; r = safe_atou(e, &u); + r = parse_ip_port(e, &port); if (r < 0) return r; @@ -105,6 +108,7 @@ int socket_address_parse(SocketAddress *a, const char *s) { a->sockaddr.in6.sin6_family = AF_INET6; a->sockaddr.in6.sin6_port = htobe16((uint16_t)u); + a->sockaddr.in6.sin6_port = htobe16(port); a->size = sizeof(struct sockaddr_in6); } else if (*s == '/') { @@ -135,12 +139,14 @@ int socket_address_parse(SocketAddress *a, const char *s) { } else if (startswith(s, "vsock:")) { /* AF_VSOCK socket in vsock:cid:port notation */ const char *cid_start = s + STRLEN("vsock:"); + unsigned port; e = strchr(cid_start, ':'); if (!e) return -EINVAL; r = safe_atou(e+1, &u); + r = safe_atou(e+1, &port); if (r < 0) return r; @@ -154,12 +160,16 @@ int socket_address_parse(SocketAddress *a, const char *s) { a->sockaddr.vm.svm_family = AF_VSOCK; a->sockaddr.vm.svm_port = u; + a->sockaddr.vm.svm_port = port; a->size = sizeof(struct sockaddr_vm); } else { + uint16_t port; + e = strchr(s, ':'); if (e) { r = safe_atou(e+1, &u); + r = parse_ip_port(e + 1, &port); if (r < 0) return r; @@ -177,6 +187,7 @@ int socket_address_parse(SocketAddress *a, const char *s) { /* Gotcha, it's a traditional IPv4 address */ a->sockaddr.in.sin_family = AF_INET; a->sockaddr.in.sin_port = htobe16((uint16_t)u); + a->sockaddr.in.sin_port = htobe16(port); a->size = sizeof(struct sockaddr_in); } else { unsigned idx; @@ -191,6 +202,7 @@ int socket_address_parse(SocketAddress *a, const char *s) { a->sockaddr.in6.sin6_family = AF_INET6; a->sockaddr.in6.sin6_port = htobe16((uint16_t)u); + a->sockaddr.in6.sin6_port = htobe16(port); a->sockaddr.in6.sin6_scope_id = idx; a->sockaddr.in6.sin6_addr = in6addr_any; a->size = sizeof(struct sockaddr_in6); @@ -199,6 +211,7 @@ int socket_address_parse(SocketAddress *a, const char *s) { /* Just a port */ r = safe_atou(s, &u); + r = parse_ip_port(s, &port); if (r < 0) return r; @@ -208,11 +221,13 @@ int socket_address_parse(SocketAddress *a, const char *s) { if (socket_ipv6_is_supported()) { a->sockaddr.in6.sin6_family = AF_INET6; a->sockaddr.in6.sin6_port = htobe16((uint16_t)u); + a->sockaddr.in6.sin6_port = htobe16(port); a->sockaddr.in6.sin6_addr = in6addr_any; a->size = sizeof(struct sockaddr_in6); } else { a->sockaddr.in.sin_family = AF_INET; a->sockaddr.in.sin_port = htobe16((uint16_t)u); + a->sockaddr.in.sin_port = htobe16(port); a->sockaddr.in.sin_addr.s_addr = INADDR_ANY; a->size = sizeof(struct sockaddr_in); } -- 2.30.2