diff options
author | Serghei Samsi <sscdvp@gmail.com> | 2015-11-12 14:00:29 -0500 |
---|---|---|
committer | Dan McDonald <danmcd@omniti.com> | 2015-11-12 14:05:42 -0500 |
commit | 808b84d02d9e58543ac8cde2701dec91a8c237f0 (patch) | |
tree | d81c0e76b7df863461d9e783760a4dba98dafb55 /usr/src | |
parent | 96ca3711e9e66e902935bf99eacbc420596e8f22 (diff) | |
download | illumos-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.c | 14 |
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); |