]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1339: missing out-of-memory checks for enc_to_utf16()/utf16_to_enc() v9.1.1339
authorJohn Marriott <basilisk@internode.on.net>
Wed, 23 Apr 2025 18:56:08 +0000 (20:56 +0200)
committerChristian Brabandt <cb@256bit.org>
Wed, 23 Apr 2025 18:56:08 +0000 (20:56 +0200)
Problem:  missing out-of-memory checks for enc_to_utf16() and
          utf16_to_enc()
Solution: Add out-of-memory checks and fix a few other minor issues
          (John Marriott)

This change does:
-  add missing out-of-memory checks for enc_to_utf16() and
   utf16_to_enc()
-  add a small optimisation in mch_errmsg_c() and mch_msg_c() (in
   message.c) to only call STRLEN() if needed.
-  fix a memory leak in winpty_term_and_job_init() (in terminal.c).

closes: #17191

Signed-off-by: John Marriott <basilisk@internode.on.net>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/fileio.c
src/gui_w32.c
src/message.c
src/os_mswin.c
src/os_win32.c
src/terminal.c
src/version.c

index 0ccfd2d99d1f267e83417755a01d76f2675e089e..f6e35ab7feffe21478b38da8e801b57ab314826a 100644 (file)
@@ -5476,6 +5476,8 @@ vim_tempname(
     // "sh".  NOTE: This also checks 'shellcmdflag' to help those people who
     // didn't set 'shellslash' but only if not using PowerShell.
     retval = utf16_to_enc(itmp, NULL);
+    if (retval == NULL)
+       return NULL;
     shname = gettail(p_sh);
     if ((*p_shcf == '-' && !(strstr((char *)shname, "powershell") != NULL
                             || strstr((char *)shname, "pwsh") != NULL ))
index 78f252a8b75d3dbe867caff95000e9bb85b71766..0debae9bfa4a5930e9abecb924cb4ac1033b0686 100644 (file)
@@ -7127,8 +7127,11 @@ dialog_callback(
 
            GetDlgItemTextW(hwnd, DLG_NONBUTTON_CONTROL + 2, wp, IOSIZE);
            p = utf16_to_enc(wp, NULL);
-           vim_strncpy(s_textfield, p, IOSIZE);
-           vim_free(p);
+           if (p != NULL)
+           {
+               vim_strncpy(s_textfield, p, IOSIZE);
+               vim_free(p);
+           }
            vim_free(wp);
        }
 
index 99fe675d82c84d24e3edcb5d569916f3f2c07847..eade461855559afbac9b29de6c23da408ea913ac 100644 (file)
@@ -3508,7 +3508,6 @@ do_more_prompt(int typed_char)
     static void
 mch_errmsg_c(char *str)
 {
-    int            len = (int)STRLEN(str);
     DWORD   nwrite = 0;
     DWORD   mode = 0;
     HANDLE  h = GetStdHandle(STD_ERROR_HANDLE);
@@ -3516,10 +3515,14 @@ mch_errmsg_c(char *str)
     if (GetConsoleMode(h, &mode) && enc_codepage >= 0
            && (int)GetConsoleCP() != enc_codepage)
     {
+       int     len = (int)STRLEN(str);
        WCHAR   *w = enc_to_utf16((char_u *)str, &len);
 
-       WriteConsoleW(h, w, len, &nwrite, NULL);
-       vim_free(w);
+       if (w != NULL)
+       {
+           WriteConsoleW(h, w, len, &nwrite, NULL);
+           vim_free(w);
+       }
     }
     else
     {
@@ -3614,19 +3617,21 @@ mch_errmsg(char *str)
     static void
 mch_msg_c(char *str)
 {
-    int            len = (int)STRLEN(str);
     DWORD   nwrite = 0;
     DWORD   mode;
     HANDLE  h = GetStdHandle(STD_OUTPUT_HANDLE);
 
-
     if (GetConsoleMode(h, &mode) && enc_codepage >= 0
            && (int)GetConsoleCP() != enc_codepage)
     {
+       int     len = (int)STRLEN(str);
        WCHAR   *w = enc_to_utf16((char_u *)str, &len);
 
-       WriteConsoleW(h, w, len, &nwrite, NULL);
-       vim_free(w);
+       if (w != NULL)
+       {
+           WriteConsoleW(h, w, len, &nwrite, NULL);
+           vim_free(w);
+       }
     }
     else
     {
index c47346033f025e6537d951c89723c5a711c9de21..4d09f9ecd7dc22c65d8f98e6e7037e0e43dc47cd 100644 (file)
@@ -3180,10 +3180,12 @@ get_logfont(
                    if (cp->name == NULL && verbose)
                    {
                        char_u *s = utf16_to_enc(p, NULL);
-
-                       semsg(_(e_illegal_str_name_str_in_font_name_str),
-                                                          "charset", s, name);
-                       vim_free(s);
+                       if (s != NULL)
+                       {
+                           semsg(_(e_illegal_str_name_str_in_font_name_str),
+                                                              "charset", s, name);
+                           vim_free(s);
+                       }
                        break;
                    }
                    break;
@@ -3202,9 +3204,12 @@ get_logfont(
                    if (qp->name == NULL && verbose)
                    {
                        char_u *s = utf16_to_enc(p, NULL);
-                       semsg(_(e_illegal_str_name_str_in_font_name_str),
-                                                          "quality", s, name);
-                       vim_free(s);
+                       if (s != NULL)
+                       {
+                           semsg(_(e_illegal_str_name_str_in_font_name_str),
+                                                              "quality", s, name);
+                           vim_free(s);
+                       }
                        break;
                    }
                    break;
index 0ba4eedb94dff033ae97a688e240772905b15b4a..799ec578d1f02bd817355d1651152170b9ffe919 100644 (file)
@@ -3810,10 +3810,13 @@ mch_dirname(
     if (GetLongPathNameW(wbuf, wcbuf, _MAX_PATH) != 0)
     {
        p = utf16_to_enc(wcbuf, NULL);
-       if (STRLEN(p) >= (size_t)len)
+       if (p != NULL)
        {
-           // long path name is too long, fall back to short one
-           VIM_CLEAR(p);
+           if (STRLEN(p) >= (size_t)len)
+           {
+               // long path name is too long, fall back to short one
+               VIM_CLEAR(p);
+           }
        }
     }
     if (p == NULL)
index 88791b865bfe41ab114ab65f317befa62b566b72..29926bf19ac728619dc099a4ff0cfee45727ce0c 100644 (file)
@@ -7083,7 +7083,11 @@ conpty_term_and_job_init(
     if (cmd_wchar == NULL)
        goto failed;
     if (opt->jo_cwd != NULL)
+    {
        cwd_wchar = enc_to_utf16(opt->jo_cwd, NULL);
+       if (cwd_wchar == NULL)
+           goto failed;
+    }
 
     win32_build_env(opt->jo_env, &ga_env, TRUE);
     env_wchar = ga_env.ga_data;
@@ -7425,7 +7429,11 @@ winpty_term_and_job_init(
     if (cmd_wchar == NULL)
        goto failed;
     if (opt->jo_cwd != NULL)
+    {
        cwd_wchar = enc_to_utf16(opt->jo_cwd, NULL);
+       if (cwd_wchar == NULL)
+           goto failed;
+    }
 
     win32_build_env(opt->jo_env, &ga_env, TRUE);
     env_wchar = ga_env.ga_data;
@@ -7585,7 +7593,11 @@ failed:
        char *msg = (char *)utf16_to_enc(
                                (short_u *)winpty_error_msg(winpty_err), NULL);
 
-       emsg(msg);
+       if (msg != NULL)
+       {
+           emsg(msg);
+           vim_free(msg);
+       }
        winpty_error_free(winpty_err);
     }
     return FAIL;
index e9dc252ea3014f1b49cacbd28c43760e180b44d5..d9b6e71b2074e3e593b0974334fe925ea08248b6 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1339,
 /**/
     1338,
 /**/