Print this page
6452 ilbd leaks lmalloc() memory due to posix_spawn() sloppiness
Reviewed by: Albert Lee <trisk@omniti.com>

*** 21,30 **** --- 21,31 ---- /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. * Copyright 2012 Milan Jurik. All rights reserved. + * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved. */ #include <sys/types.h> #include <sys/socket.h> #include <sys/list.h>
*** 1286,1309 **** return (B_FALSE); } /* Set our side of the pipe to be non-blocking */ if ((fdflags = fcntl(fds[0], F_GETFL, 0)) == -1) { logdebug("ilbd_run_probe: fcntl(F_GETFL)"); ! goto cleanup; } if (fcntl(fds[0], F_SETFL, fdflags | O_NONBLOCK) == -1) { logdebug("ilbd_run_probe: fcntl(F_SETFL)"); ! goto cleanup; } if (posix_spawn_file_actions_init(&fd_actions) != 0) { logdebug("ilbd_run_probe: posix_spawn_file_actions_init"); ! goto cleanup; } if (posix_spawnattr_init(&attr) != 0) { logdebug("ilbd_run_probe: posix_spawnattr_init"); ! goto cleanup; } if (posix_spawn_file_actions_addclose(&fd_actions, fds[0]) != 0) { logdebug("ilbd_run_probe: posix_spawn_file_actions_addclose"); goto cleanup; } --- 1287,1310 ---- return (B_FALSE); } /* Set our side of the pipe to be non-blocking */ if ((fdflags = fcntl(fds[0], F_GETFL, 0)) == -1) { logdebug("ilbd_run_probe: fcntl(F_GETFL)"); ! goto cleanup_noactions; } if (fcntl(fds[0], F_SETFL, fdflags | O_NONBLOCK) == -1) { logdebug("ilbd_run_probe: fcntl(F_SETFL)"); ! goto cleanup_noactions; } if (posix_spawn_file_actions_init(&fd_actions) != 0) { logdebug("ilbd_run_probe: posix_spawn_file_actions_init"); ! goto cleanup_noactions; } if (posix_spawnattr_init(&attr) != 0) { logdebug("ilbd_run_probe: posix_spawnattr_init"); ! goto cleanup_noattr; } if (posix_spawn_file_actions_addclose(&fd_actions, fds[0]) != 0) { logdebug("ilbd_run_probe: posix_spawn_file_actions_addclose"); goto cleanup; }
*** 1353,1364 **** srv->shc_hc->ihc_test, srv->shc_sg_srv->sgs_srvID, strerror(errno)); goto cleanup; } (void) close(fds[1]); - destroy_argv(child_argv); srv->shc_child_pid = pid; srv->shc_child_fd = fds[0]; srv->shc_ev = probe_ev; probe_ev->ihp_ev = ILBD_EVENT_PROBE; --- 1354,1366 ---- srv->shc_hc->ihc_test, srv->shc_sg_srv->sgs_srvID, strerror(errno)); goto cleanup; } + (void) posix_spawnattr_destroy(&attr); + (void) posix_spawn_file_actions_destroy(&fd_actions); (void) close(fds[1]); srv->shc_child_pid = pid; srv->shc_child_fd = fds[0]; srv->shc_ev = probe_ev; probe_ev->ihp_ev = ILBD_EVENT_PROBE;
*** 1370,1385 **** * Need to kill the child. It will free the srv->shc_ev, * which is probe_ev. So set probe_ev to NULL. */ ilbd_hc_kill_probe(srv); probe_ev = NULL; ! goto cleanup; } return (B_TRUE); cleanup: (void) close(fds[0]); (void) close(fds[1]); destroy_argv(child_argv); if (probe_ev != NULL) free(probe_ev); --- 1372,1393 ---- * Need to kill the child. It will free the srv->shc_ev, * which is probe_ev. So set probe_ev to NULL. */ ilbd_hc_kill_probe(srv); probe_ev = NULL; ! /* posix_spawn attrs & actions already destroyed. */ ! goto cleanup_noactions; } + destroy_argv(child_argv); return (B_TRUE); cleanup: + (void) posix_spawnattr_destroy(&attr); + cleanup_noattr: + (void) posix_spawn_file_actions_destroy(&fd_actions); + cleanup_noactions: (void) close(fds[0]); (void) close(fds[1]); destroy_argv(child_argv); if (probe_ev != NULL) free(probe_ev);