diff options
author | trasz <trasz@FreeBSD.org> | 2014-09-15 16:40:27 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2014-09-15 16:40:27 +0000 |
commit | 95a8c9b2acae5c0b026ec0da457fe53839c22296 (patch) | |
tree | 731f1d2c5ad268939e6cf70c21b47e72e774ad39 | |
parent | 0c1d52f3f7075ef122270f8a41ff0f50fcc16925 (diff) | |
download | FreeBSD-src-95a8c9b2acae5c0b026ec0da457fe53839c22296.zip FreeBSD-src-95a8c9b2acae5c0b026ec0da457fe53839c22296.tar.gz |
MFC r271187:
Avoid ctld(8) crash on getaddrinfo(3) failure.
Approved by: re (gjb)
Sponsored by: The FreeBSD Foundation
-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); } |