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 /usr.sbin/ctld | |
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.
Diffstat (limited to 'usr.sbin/ctld')
-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 |