diff options
author | mav <mav@FreeBSD.org> | 2014-12-10 08:53:41 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2014-12-10 08:53:41 +0000 |
commit | 43c3b12592af48efcbeb4e0b341a29cddc8a9a09 (patch) | |
tree | 499de59814062fb9ca5ff8c50da6f926f6f270b9 | |
parent | 4875c0a2054728926c5384b2812d593178eeabfd (diff) | |
download | FreeBSD-src-43c3b12592af48efcbeb4e0b341a29cddc8a9a09.zip FreeBSD-src-43c3b12592af48efcbeb4e0b341a29cddc8a9a09.tar.gz |
MFC r275452: Do not corrupt the listen string when parsing it.
This fixes problem with ctld reload when it is configured to listen on two
portals with same IP, but different ports.
-rw-r--r-- | usr.sbin/ctld/ctld.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c index bbf8e7d..0565339 100644 --- a/usr.sbin/ctld/ctld.c +++ b/usr.sbin/ctld/ctld.c @@ -643,10 +643,11 @@ static int parse_addr_port(char *arg, const char *def_port, struct addrinfo **ai) { struct addrinfo hints; - char *addr, *ch; + char *str, *addr, *ch; const char *port; int error, colons = 0; + str = arg = strdup(arg); if (arg[0] == '[') { /* * IPv6 address in square brackets, perhaps with port. @@ -659,8 +660,10 @@ parse_addr_port(char *arg, const char *def_port, struct addrinfo **ai) port = def_port; } else if (arg[0] == ':') { port = arg + 1; - } else + } else { + free(str); return (1); + } } else { /* * Either IPv6 address without brackets - and without @@ -687,9 +690,8 @@ parse_addr_port(char *arg, const char *def_port, struct addrinfo **ai) hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; error = getaddrinfo(addr, port, &hints, ai); - if (error != 0) - return (1); - return (0); + free(str); + return ((error != 0) ? 1 : 0); } int |