From b32800e33ec16f7c592fa09b1a8b1f30a2e9df77 Mon Sep 17 00:00:00 2001 From: David Härdeman Date: Fri, 19 Jun 2020 00:07:33 +0200 Subject: Add an addrstr to struct sockaddr_in46, rename to struct saddr --- config.c | 130 ++++++++++++++++++++++++++++++++++----------------------------- 1 file changed, 71 insertions(+), 59 deletions(-) (limited to 'config.c') diff --git a/config.c b/config.c index 5affeff..de0522e 100644 --- a/config.c +++ b/config.c @@ -67,7 +67,7 @@ strtosockaddrs(const char *str, struct list_head *list) char *tmp; uint16_t port; int r; - struct sockaddr_in46 *addr; + struct saddr *saddr; if (!str || *str == '\0' || !list) return false; @@ -83,14 +83,16 @@ strtosockaddrs(const char *str, struct list_head *list) goto out; *tmp = '\0'; - addr = zmalloc(sizeof(*addr)); - if (!addr) + saddr = zmalloc(sizeof(*saddr)); + if (!saddr) goto out; - list_add(&addr->list, list); + + /* early list_add to make sure saddr is free():d on error */ + list_add(&saddr->list, list); if (!strcmp(str, "*")) - addr->in6.sin6_addr = in6addr_any; - else if (inet_pton(AF_INET6, str, &addr->in6.sin6_addr) <= 0) + saddr->in6.sin6_addr = in6addr_any; + else if (inet_pton(AF_INET6, str, &saddr->in6.sin6_addr) <= 0) goto out; tmp++; @@ -101,9 +103,10 @@ strtosockaddrs(const char *str, struct list_head *list) if (strtou16_strict(tmp, &port) < 0) goto out; - addr->in6.sin6_family = AF_INET6; - addr->in6.sin6_port = htons(port); - addr->addrlen = sizeof(addr->in6); + saddr->in6.sin6_family = AF_INET6; + saddr->in6.sin6_port = htons(port); + saddr->addrlen = sizeof(saddr->in6); + saddr_set_str(saddr); } else if (*str == '*') { /* IPv4, *:p */ @@ -117,15 +120,16 @@ strtosockaddrs(const char *str, struct list_head *list) if (strtou16_strict(str, &port) < 0) goto out; - addr = zmalloc(sizeof(*addr)); - if (!addr) + saddr = zmalloc(sizeof(*saddr)); + if (!saddr) goto out; - list_add(&addr->list, list); - addr->in4.sin_family = AF_INET; - addr->in4.sin_addr.s_addr = INADDR_ANY; - addr->in4.sin_port = htons(port); - addr->addrlen = sizeof(addr->in4); + saddr->in4.sin_family = AF_INET; + saddr->in4.sin_addr.s_addr = INADDR_ANY; + saddr->in4.sin_port = htons(port); + saddr->addrlen = sizeof(saddr->in4); + saddr_set_str(saddr); + list_add(&saddr->list, list); } else if ((tmp = strchr(str, ':'))) { /* IPv4, a.b.c.d:p or IPv4/6 hostname:p */ @@ -136,19 +140,20 @@ strtosockaddrs(const char *str, struct list_head *list) if (strtou16_strict(tmp, &port) < 0) goto out; - addr = zmalloc(sizeof(*addr)); - if (!addr) + saddr = zmalloc(sizeof(*saddr)); + if (!saddr) goto out; - if (inet_pton(AF_INET, str, &addr->in4.sin_addr) > 0) { + if (inet_pton(AF_INET, str, &saddr->in4.sin_addr) > 0) { debug(DBG_CFG, "got an IPv4:port (%s)\n", str); - addr->in4.sin_family = AF_INET; - addr->in4.sin_port = htons(port); - addr->addrlen = sizeof(addr->in4); - list_add(&addr->list, list); + saddr->in4.sin_family = AF_INET; + saddr->in4.sin_port = htons(port); + saddr->addrlen = sizeof(saddr->in4); + saddr_set_str(saddr); + list_add(&saddr->list, list); goto success; } else { - xfree(addr); + xfree(saddr); } struct addrinfo hints = { @@ -168,8 +173,8 @@ strtosockaddrs(const char *str, struct list_head *list) debug(DBG_CFG, "got a hostname:port (%s)\n", str); for (ai = results; ai; ai = ai->ai_next) { - addr = zmalloc(sizeof(*addr)); - if (!addr) { + saddr = zmalloc(sizeof(*saddr)); + if (!saddr) { freeaddrinfo(results); goto out; } @@ -178,27 +183,29 @@ strtosockaddrs(const char *str, struct list_head *list) case AF_INET: { struct sockaddr_in *naddr = (struct sockaddr_in *)ai->ai_addr; - addr->in4.sin_family = AF_INET; - addr->in4.sin_addr = naddr->sin_addr; - addr->in4.sin_port = naddr->sin_port; - addr->addrlen = sizeof(addr->in4); - list_add(&addr->list, list); + saddr->in4.sin_family = AF_INET; + saddr->in4.sin_addr = naddr->sin_addr; + saddr->in4.sin_port = naddr->sin_port; + saddr->addrlen = sizeof(saddr->in4); + saddr_set_str(saddr); + list_add(&saddr->list, list); break; } case AF_INET6: { struct sockaddr_in6 *naddr = (struct sockaddr_in6 *)ai->ai_addr; - addr->in6.sin6_family = AF_INET6; - addr->in6.sin6_addr = naddr->sin6_addr; - addr->in6.sin6_port = naddr->sin6_port; - addr->addrlen = sizeof(addr->in6); - list_add(&addr->list, list); + saddr->in6.sin6_family = AF_INET6; + saddr->in6.sin6_addr = naddr->sin6_addr; + saddr->in6.sin6_port = naddr->sin6_port; + saddr->addrlen = sizeof(saddr->in6); + saddr_set_str(saddr); + list_add(&saddr->list, list); break; } default: error("getaddrinfo(%s): unknown address family (%i)\n", str, ai->ai_family); - xfree(addr); + xfree(saddr); continue; } } @@ -209,23 +216,28 @@ strtosockaddrs(const char *str, struct list_head *list) /* Port */ debug(DBG_CFG, "attempting to parse a port number (%s)\n", str); - addr = zmalloc(sizeof(*addr)); - if (!addr) + saddr = zmalloc(sizeof(*saddr)); + if (!saddr) goto out; - addr->in6.sin6_family = AF_INET6; - addr->in6.sin6_addr = in6addr_any; - addr->in6.sin6_port = htons(port); - addr->addrlen = sizeof(addr->in6); - list_add(&addr->list, list); - - addr = zmalloc(sizeof(*addr)); - if (!addr) + + saddr->in6.sin6_family = AF_INET6; + saddr->in6.sin6_addr = in6addr_any; + saddr->in6.sin6_port = htons(port); + saddr->addrlen = sizeof(saddr->in6); + saddr_set_str(saddr); + list_add(&saddr->list, list); + + saddr = zmalloc(sizeof(*saddr)); + if (!saddr) goto out; - addr->in4.sin_family = AF_INET; - addr->in4.sin_addr.s_addr = INADDR_ANY; - addr->in4.sin_port = htons(port); - addr->addrlen = sizeof(addr->in4); - list_add(&addr->list, list); + + saddr->in4.sin_family = AF_INET; + saddr->in4.sin_addr.s_addr = INADDR_ANY; + saddr->in4.sin_port = htons(port); + saddr->addrlen = sizeof(saddr->in4); + saddr_set_str(saddr); + list_add(&saddr->list, list); + } else { /* Unknown */ error("unable to parse address: %s\n", str); @@ -239,7 +251,7 @@ success: } else { int i = 0; - list_for_each_entry(addr, list, list) + list_for_each_entry(saddr, list, list) i++; debug(DBG_CFG, "parsed to %i addresses\n", i); @@ -249,11 +261,11 @@ success: out: if (!list_empty(list)) { - struct sockaddr_in46 *tmp; + struct saddr *tmp; - list_for_each_entry_safe(addr, tmp, list, list) { - list_del(&addr->list); - xfree(addr); + list_for_each_entry_safe(saddr, tmp, list, list) { + list_del(&saddr->list); + xfree(saddr); } } return false; @@ -328,9 +340,9 @@ config_parse_line(struct cfg *cfg, const char *filename, char **buf, } case CFG_VAL_TYPE_ADDRS: { - if (!strtosockaddrs(tmp, &rvalue->addrs)) + if (!strtosockaddrs(tmp, &rvalue->saddrs)) goto out; - if (list_empty(&rvalue->addrs)) { + if (list_empty(&rvalue->saddrs)) { error("empty address list\n"); goto out; } -- cgit v1.2.3