]> granicus.if.org Git - vim/commitdiff
patch 8.0.0781: MS-Windows: memory leak when using :terminal v8.0.0781
authorBram Moolenaar <Bram@vim.org>
Thu, 27 Jul 2017 19:46:43 +0000 (21:46 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 27 Jul 2017 19:46:43 +0000 (21:46 +0200)
Problem:    MS-Windows: Memory leak when using :terminal.
Solution:   Handle failures properly. (Ken Takata)

src/terminal.c
src/version.c

index 0532d01f9fb32df7a95273a6664e1374c4399d15..6f14b3f82ac490230fd155e7d6eeaa28810cb081 100644 (file)
@@ -1153,18 +1153,19 @@ dyn_winpty_init(void)
     static int
 term_and_job_init(term_T *term, int rows, int cols, char_u *cmd)
 {
-    WCHAR          *p = enc_to_utf16(cmd, NULL);
+    WCHAR          *p;
     channel_T      *channel = NULL;
     job_T          *job = NULL;
     jobopt_T       opt;
     DWORD          error;
     HANDLE         jo = NULL, child_process_handle, child_thread_handle;
     void           *winpty_err;
-    void           *spawn_config;
+    void           *spawn_config = NULL;
 
     if (!dyn_winpty_init())
        return FAIL;
 
+    p = enc_to_utf16(cmd, NULL);
     if (p == NULL)
        return FAIL;
 
@@ -1227,9 +1228,14 @@ term_and_job_init(term_T *term, int rows, int cols, char_u *cmd)
        goto failed;
 
     if (!AssignProcessToJobObject(jo, child_process_handle))
-       goto failed;
+    {
+       /* Failed, switch the way to terminate process with TerminateProcess. */
+       CloseHandle(jo);
+       jo = NULL;
+    }
 
     winpty_spawn_config_free(spawn_config);
+    vim_free(p);
 
     create_vterm(term, rows, cols);
 
@@ -1246,6 +1252,9 @@ term_and_job_init(term_T *term, int rows, int cols, char_u *cmd)
     return OK;
 
 failed:
+    if (spawn_config != NULL)
+       winpty_spawn_config_free(spawn_config);
+    vim_free(p);
     if (channel != NULL)
        channel_clear(channel);
     if (job != NULL)
index ddac62f5a3e1133bb1b88c3c98523e2489671e60..f62d3f05b9a6fe57f923576c7b8f92f70757c136 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    781,
 /**/
     780,
 /**/