summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorSerghei Samsi <sscdvp@gmail.com>2015-11-12 14:00:29 -0500
committerDan McDonald <danmcd@omniti.com>2015-11-12 14:05:42 -0500
commit808b84d02d9e58543ac8cde2701dec91a8c237f0 (patch)
treed81c0e76b7df863461d9e783760a4dba98dafb55 /usr/src
parent96ca3711e9e66e902935bf99eacbc420596e8f22 (diff)
downloadillumos-gate-808b84d02d9e58543ac8cde2701dec91a8c237f0.tar.gz
4749 ilbd_run_probe() has several problems with resource releasing
Reviewed by: Jason King <jason.brian.king@gmail.com> Reviewed by: Dan McDonald <danmcd@omniti.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/cmd-inet/usr.lib/ilbd/ilbd_hc.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/usr/src/cmd/cmd-inet/usr.lib/ilbd/ilbd_hc.c b/usr/src/cmd/cmd-inet/usr.lib/ilbd/ilbd_hc.c
index b7d7152a41..83c833738c 100644
--- a/usr/src/cmd/cmd-inet/usr.lib/ilbd/ilbd_hc.c
+++ b/usr/src/cmd/cmd-inet/usr.lib/ilbd/ilbd_hc.c
@@ -1264,7 +1264,9 @@ static boolean_t
ilbd_run_probe(ilbd_hc_srv_t *srv)
{
posix_spawn_file_actions_t fd_actions;
+ boolean_t init_fd_actions = B_FALSE;
posix_spawnattr_t attr;
+ boolean_t init_attr = B_FALSE;
sigset_t child_sigset;
int fds[2];
int fdflags;
@@ -1299,10 +1301,12 @@ ilbd_run_probe(ilbd_hc_srv_t *srv)
logdebug("ilbd_run_probe: posix_spawn_file_actions_init");
goto cleanup;
}
+ init_fd_actions = B_TRUE;
if (posix_spawnattr_init(&attr) != 0) {
logdebug("ilbd_run_probe: posix_spawnattr_init");
goto cleanup;
}
+ init_attr = B_TRUE;
if (posix_spawn_file_actions_addclose(&fd_actions, fds[0]) != 0) {
logdebug("ilbd_run_probe: posix_spawn_file_actions_addclose");
goto cleanup;
@@ -1356,7 +1360,6 @@ ilbd_run_probe(ilbd_hc_srv_t *srv)
}
(void) close(fds[1]);
- destroy_argv(child_argv);
srv->shc_child_pid = pid;
srv->shc_child_fd = fds[0];
srv->shc_ev = probe_ev;
@@ -1375,12 +1378,19 @@ ilbd_run_probe(ilbd_hc_srv_t *srv)
goto cleanup;
}
+ destroy_argv(child_argv);
+ (void) posix_spawn_file_actions_destroy(&fd_actions);
+ (void) posix_spawnattr_destroy(&attr);
return (B_TRUE);
cleanup:
+ destroy_argv(child_argv);
+ if (init_fd_actions == B_TRUE)
+ (void) posix_spawn_file_actions_destroy(&fd_actions);
+ if (init_attr == B_TRUE)
+ (void) posix_spawnattr_destroy(&attr);
(void) close(fds[0]);
(void) close(fds[1]);
- destroy_argv(child_argv);
if (probe_ev != NULL)
free(probe_ev);
return (B_FALSE);