summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ctld/ctld.c
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2014-12-03 09:32:51 +0000
committermav <mav@FreeBSD.org>2014-12-03 09:32:51 +0000
commita0aca4af786f93871c2435166f350751af9cd192 (patch)
treecaa480a91e84c671c22d27df7b5d8f0447788c0e /usr.sbin/ctld/ctld.c
parent826327d5dbd4663217586bd43ca25540e6effa4b (diff)
downloadFreeBSD-src-a0aca4af786f93871c2435166f350751af9cd192.zip
FreeBSD-src-a0aca4af786f93871c2435166f350751af9cd192.tar.gz
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. MFC after: 1 week
Diffstat (limited to 'usr.sbin/ctld/ctld.c')
-rw-r--r--usr.sbin/ctld/ctld.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c
index 0e99be2..21e6030 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
OpenPOWER on IntegriCloud