From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1814) id 0142D3858D33; Fri, 3 Mar 2023 10:45:56 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0142D3858D33 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1677840356; bh=5C/1fhKAxS7dRMi6iGZsLTqHisaODqNWGtV5D5u4Axs=; h=From:To:Subject:Date:From; b=bcqCflTi7yb+zFa+qy1p9/6bQ2CNB+oVf7HYIKMRKrnIZ9+c9BPbm5J8NTdA9wWZS pP/b7wdX+9BY7ii12HszdV+DbiEjQqq92RcVc3HakwPWdAZxy6xieWcJZ3NyoPUlyF 47jDwQ5LDG3UO9QOWGOFCyQOorqfEvDI5Q3GbnRo= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Jonathan Yong To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-6442] libiberty: fix memory leak in pex-win32.c and refactor X-Act-Checkin: gcc X-Git-Author: Costas Argyris X-Git-Refname: refs/heads/master X-Git-Oldrev: dbeccab7a1f5dcc1876c854f17816047ba1ef137 X-Git-Newrev: 59bc2b68de8041adf5eeb5bd18e5921f8a1f9567 Message-Id: <20230303104556.0142D3858D33@sourceware.org> Date: Fri, 3 Mar 2023 10:45:56 +0000 (GMT) List-Id: https://gcc.gnu.org/g:59bc2b68de8041adf5eeb5bd18e5921f8a1f9567 commit r13-6442-g59bc2b68de8041adf5eeb5bd18e5921f8a1f9567 Author: Costas Argyris Date: Sun Feb 26 16:34:11 2023 +0000 libiberty: fix memory leak in pex-win32.c and refactor Fix memory leak of cmdline buffer and refactor to have cleanup code appear once for all exit cases. libiberty/ChangeLog: * pex-win32.c (win32_spawn): Fix memory leak of cmdline buffer and refactor to have cleanup code appear once for all exit cases. Signed-off-by: Jonathan Yong <10walls@gmail.com> Diff: --- libiberty/pex-win32.c | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/libiberty/pex-win32.c b/libiberty/pex-win32.c index 02d3a3e839b..23c6c190a2c 100644 --- a/libiberty/pex-win32.c +++ b/libiberty/pex-win32.c @@ -577,14 +577,12 @@ win32_spawn (const char *executable, LPSTARTUPINFO si, LPPROCESS_INFORMATION pi) { - char *full_executable; - char *cmdline; + char *full_executable = NULL; + char *cmdline = NULL; + pid_t pid = (pid_t) -1; char **env_copy; char *env_block = NULL; - full_executable = NULL; - cmdline = NULL; - if (env) { int env_size; @@ -622,13 +620,13 @@ win32_spawn (const char *executable, full_executable = find_executable (executable, search); if (!full_executable) - goto error; + goto exit; cmdline = argv_to_cmdline (argv); if (!cmdline) - goto error; + goto exit; /* Create the child process. */ - if (!CreateProcess (full_executable, cmdline, + if (CreateProcess (full_executable, cmdline, /*lpProcessAttributes=*/NULL, /*lpThreadAttributes=*/NULL, /*bInheritHandles=*/TRUE, @@ -638,26 +636,17 @@ win32_spawn (const char *executable, si, pi)) { - free (env_block); - - free (full_executable); - - return (pid_t) -1; + CloseHandle (pi->hThread); + pid = (pid_t) pi->hProcess; } + exit: /* Clean up. */ - CloseHandle (pi->hThread); - free (full_executable); - free (env_block); - - return (pid_t) pi->hProcess; - - error: free (env_block); free (cmdline); free (full_executable); - return (pid_t) -1; + return pid; } /* Spawn a script. This simulates the Unix script execution mechanism.