diff options
author | trasz <trasz@FreeBSD.org> | 2014-09-06 09:03:13 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2014-09-06 09:03:13 +0000 |
commit | 730358ef21de594cb90284d71ff820f259df0259 (patch) | |
tree | 7f5d468befaf78a9ee0bcb0d09d85b28e6f3ea26 /usr.sbin | |
parent | bca742a609779ab4142394da813937de088c71a1 (diff) | |
download | FreeBSD-src-730358ef21de594cb90284d71ff820f259df0259.zip FreeBSD-src-730358ef21de594cb90284d71ff820f259df0259.tar.gz |
Avoid ctld(8) crash on getaddrinfo(3) failure.
MFC after: 2 weeks
Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'usr.sbin')
-rw-r--r-- | usr.sbin/ctld/ctld.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/usr.sbin/ctld/ctld.c b/usr.sbin/ctld/ctld.c index dde0330..bfdf5d0 100644 --- a/usr.sbin/ctld/ctld.c +++ b/usr.sbin/ctld/ctld.c @@ -561,8 +561,10 @@ portal_new(struct portal_group *pg) static void portal_delete(struct portal *portal) { + TAILQ_REMOVE(&portal->p_portal_group->pg_portals, portal, p_next); - freeaddrinfo(portal->p_ai); + if (portal->p_ai != NULL) + freeaddrinfo(portal->p_ai); free(portal->p_listen); free(portal); } @@ -633,8 +635,7 @@ portal_group_add_listen(struct portal_group *pg, const char *value, bool iser) arg = portal->p_listen; if (arg[0] == '\0') { log_warnx("empty listen address"); - free(portal->p_listen); - free(portal); + portal_delete(portal); return (1); } if (arg[0] == '[') { @@ -646,8 +647,7 @@ portal_group_add_listen(struct portal_group *pg, const char *value, bool iser) if (arg == NULL) { log_warnx("invalid listen address %s", portal->p_listen); - free(portal->p_listen); - free(portal); + portal_delete(portal); return (1); } if (arg[0] == '\0') { @@ -657,8 +657,7 @@ portal_group_add_listen(struct portal_group *pg, const char *value, bool iser) } else { log_warnx("invalid listen address %s", portal->p_listen); - free(portal->p_listen); - free(portal); + portal_delete(portal); return (1); } } else { @@ -691,8 +690,7 @@ portal_group_add_listen(struct portal_group *pg, const char *value, bool iser) if (error != 0) { log_warnx("getaddrinfo for %s failed: %s", portal->p_listen, gai_strerror(error)); - free(portal->p_listen); - free(portal); + portal_delete(portal); return (1); } |