Patch 8.1.0976
Problem:    Dosinstall still has buffer overflow problems.
Solution:   Adjust  buffer sizes. (Yasuhiro Matsumoto, closes #4002)
Files:      src/dosinst.c, src/dosinst.h, src/uninstal.c


*** ../vim-8.1.0975/src/dosinst.c       2019-02-18 22:19:29.124186022 +0100
--- src/dosinst.c       2019-02-22 19:37:38.442404717 +0100
***************
*** 388,394 ****
  
      /* First get $VIMRUNTIME.  If it's set, remove the tail. */
      vim = getenv("VIMRUNTIME");
!     if (vim != NULL && *vim != 0 && strlen(vim) < BUFSIZE)
      {
        strcpy(buf, vim);
        remove_tail(buf);
--- 388,394 ----
  
      /* First get $VIMRUNTIME.  If it's set, remove the tail. */
      vim = getenv("VIMRUNTIME");
!     if (vim != NULL && *vim != 0 && strlen(vim) < sizeof(buf))
      {
        strcpy(buf, vim);
        remove_tail(buf);
***************
*** 411,417 ****
  
      /* NSIS also uses GetTempPath(), thus we should get the same directory
       * name as where NSIS will look for vimini.ini. */
!     GetTempPath(BUFSIZE, fname);
      add_pathsep(fname);
      strcat(fname, "vimini.ini");
  
--- 411,417 ----
  
      /* NSIS also uses GetTempPath(), thus we should get the same directory
       * name as where NSIS will look for vimini.ini. */
!     GetTempPath(sizeof(fname) - 12, fname);
      add_pathsep(fname);
      strcat(fname, "vimini.ini");
  
***************
*** 456,462 ****
      static int
  run_silent_uninstall(char *uninst_exe)
  {
!     char    vimrt_dir[MAX_PATH];
      char    temp_uninst[BUFSIZE];
      char    temp_dir[MAX_PATH];
      char    buf[BUFSIZE * 2 + 10];
--- 456,462 ----
      static int
  run_silent_uninstall(char *uninst_exe)
  {
!     char    vimrt_dir[BUFSIZE];
      char    temp_uninst[BUFSIZE];
      char    temp_dir[MAX_PATH];
      char    buf[BUFSIZE * 2 + 10];
***************
*** 506,512 ****
      char      *uninstall_key = 
"software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
      char      subkey_name_buff[BUFSIZE];
      char      temp_string_buffer[BUFSIZE-2];
!     DWORD     local_bufsize = BUFSIZE;
      FILETIME  temp_pfiletime;
      DWORD     key_index;
      char      input;
--- 506,512 ----
      char      *uninstall_key = 
"software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
      char      subkey_name_buff[BUFSIZE];
      char      temp_string_buffer[BUFSIZE-2];
!     DWORD     local_bufsize;
      FILETIME  temp_pfiletime;
      DWORD     key_index;
      char      input;
***************
*** 521,532 ****
                                     KEY_WOW64_64KEY | KEY_READ, &key_handle);
      CHECK_REG_ERROR(code);
  
!     for (key_index = 0;
!        RegEnumKeyEx(key_handle, key_index, subkey_name_buff, &local_bufsize,
!               NULL, NULL, NULL, &temp_pfiletime) != ERROR_NO_MORE_ITEMS;
!           key_index++)
      {
!       local_bufsize = BUFSIZE;
        if (strncmp("Vim", subkey_name_buff, 3) == 0)
        {
            /* Open the key named Vim* */
--- 521,534 ----
                                     KEY_WOW64_64KEY | KEY_READ, &key_handle);
      CHECK_REG_ERROR(code);
  
!     key_index = 0;
!     while (TRUE)
      {
!       local_bufsize = sizeof(subkey_name_buff);
!       if (RegEnumKeyEx(key_handle, key_index, subkey_name_buff, 
&local_bufsize,
!               NULL, NULL, NULL, &temp_pfiletime) == ERROR_NO_MORE_ITEMS)
!           break;
! 
        if (strncmp("Vim", subkey_name_buff, 3) == 0)
        {
            /* Open the key named Vim* */
***************
*** 535,544 ****
            CHECK_REG_ERROR(code);
  
            /* get the DisplayName out of it to show the user */
            code = RegQueryValueEx(uninstall_key_handle, "displayname", 0,
                    &value_type, (LPBYTE)temp_string_buffer,
                    &local_bufsize);
-           local_bufsize = BUFSIZE;
            CHECK_REG_ERROR(code);
  
            allow_silent = 0;
--- 537,546 ----
            CHECK_REG_ERROR(code);
  
            /* get the DisplayName out of it to show the user */
+           local_bufsize = sizeof(temp_string_buffer);
            code = RegQueryValueEx(uninstall_key_handle, "displayname", 0,
                    &value_type, (LPBYTE)temp_string_buffer,
                    &local_bufsize);
            CHECK_REG_ERROR(code);
  
            allow_silent = 0;
***************
*** 568,576 ****
            fflush(stdout);
  
            /* get the UninstallString */
            code = RegQueryValueEx(uninstall_key_handle, "uninstallstring", 0,
                    &value_type, (LPBYTE)temp_string_buffer, &local_bufsize);
-           local_bufsize = BUFSIZE;
            CHECK_REG_ERROR(code);
  
            /* Remember the directory, it is used as the default for NSIS. */
--- 570,578 ----
            fflush(stdout);
  
            /* get the UninstallString */
+           local_bufsize = sizeof(temp_string_buffer);
            code = RegQueryValueEx(uninstall_key_handle, "uninstallstring", 0,
                    &value_type, (LPBYTE)temp_string_buffer, &local_bufsize);
            CHECK_REG_ERROR(code);
  
            /* Remember the directory, it is used as the default for NSIS. */
***************
*** 683,688 ****
--- 685,692 ----
  
            RegCloseKey(uninstall_key_handle);
        }
+ 
+       key_index++;
      }
      RegCloseKey(key_handle);
  
***************
*** 1826,1832 ****
            /* translate the (possibly) multibyte shortcut filename to windows
             * Unicode so it can be used as a file name.
             */
!           MultiByteToWideChar(CP_ACP, 0, shortcut_name, -1, wsz, BUFSIZE);
  
            /* set the attributes */
            shelllink_ptr->lpVtbl->SetPath(shelllink_ptr, shortcut_target);
--- 1830,1836 ----
            /* translate the (possibly) multibyte shortcut filename to windows
             * Unicode so it can be used as a file name.
             */
!           MultiByteToWideChar(CP_ACP, 0, shortcut_name, -1, wsz, 
sizeof(wsz)/sizeof(wsz[0]));
  
            /* set the attributes */
            shelllink_ptr->lpVtbl->SetPath(shelllink_ptr, shortcut_target);
***************
*** 2135,2141 ****
   * result in "to[]".
   */
      static void
! dir_remove_last(const char *path, char to[BUFSIZE])
  {
      char c;
      long last_char_to_copy;
--- 2139,2145 ----
   * result in "to[]".
   */
      static void
! dir_remove_last(const char *path, char to[MAX_PATH])
  {
      char c;
      long last_char_to_copy;
***************
*** 2206,2212 ****
        if (homepath == NULL || *homepath == NUL)
            homepath = "\\";
        if (homedrive != NULL
!                          && strlen(homedrive) + strlen(homepath) < MAX_PATH)
        {
            sprintf(buf, "%s%s", homedrive, homepath);
            if (buf[0] != NUL)
--- 2210,2216 ----
        if (homepath == NULL || *homepath == NUL)
            homepath = "\\";
        if (homedrive != NULL
!                  && strlen(homedrive) + strlen(homepath) < sizeof(buf))
        {
            sprintf(buf, "%s%s", homedrive, homepath);
            if (buf[0] != NUL)
***************
*** 2234,2243 ****
            buf[p - (var + 1)] = NUL;
            exp = getenv(buf);
            if (exp != NULL && *exp != NUL
!                                       && strlen(exp) + strlen(p) < MAX_PATH)
            {
!               _snprintf(buf, MAX_PATH, "%s%s", exp, p + 1);
!               buf[MAX_PATH - 1] = NUL;
                var = buf;
            }
        }
--- 2238,2246 ----
            buf[p - (var + 1)] = NUL;
            exp = getenv(buf);
            if (exp != NULL && *exp != NUL
!                               && strlen(exp) + strlen(p) < sizeof(buf))
            {
!               sprintf(buf, "%s%s", exp, p + 1);
                var = buf;
            }
        }
***************
*** 2351,2360 ****
  
      // Check if the "compiler" directory already exists.  That's a good
      // indication that the plugin directories were already created.
!     if (getenv("HOME") != NULL)
      {
        vimfiles_dir_choice = (int)vimfiles_dir_home;
!       sprintf(tmp_dirname, "%s\\vimfiles\\compiler", getenv("HOME"));
        if (stat(tmp_dirname, &st) == 0)
            vimfiles_dir_choice = (int)vimfiles_dir_none;
      }
--- 2354,2364 ----
  
      // Check if the "compiler" directory already exists.  That's a good
      // indication that the plugin directories were already created.
!     p = getenv("HOME");
!     if (p != NULL)
      {
        vimfiles_dir_choice = (int)vimfiles_dir_home;
!       sprintf(tmp_dirname, "%s\\vimfiles\\compiler", p);
        if (stat(tmp_dirname, &st) == 0)
            vimfiles_dir_choice = (int)vimfiles_dir_none;
      }
*** ../vim-8.1.0975/src/dosinst.h       2019-02-18 22:19:29.124186022 +0100
--- src/dosinst.h       2019-02-22 19:33:42.519738742 +0100
***************
*** 59,65 ****
  /* ---------------------------------------- */
  
  
! #define BUFSIZE 512           /* long enough to hold a file name path */
  #define NUL 0
  
  #define FAIL 0
--- 59,65 ----
  /* ---------------------------------------- */
  
  
! #define BUFSIZE (MAX_PATH*2)          /* long enough to hold a file name path 
*/
  #define NUL 0
  
  #define FAIL 0
***************
*** 93,107 ****
      static void *
  alloc(int len)
  {
!     char *s;
  
!     s = malloc(len);
!     if (s == NULL)
      {
        printf("ERROR: out of memory\n");
        exit(1);
      }
!     return (void *)s;
  }
  
  /*
--- 93,107 ----
      static void *
  alloc(int len)
  {
!     void *p;
  
!     p = malloc(len);
!     if (p == NULL)
      {
        printf("ERROR: out of memory\n");
        exit(1);
      }
!     return p;
  }
  
  /*
***************
*** 512,518 ****
  do_inits(char **argv)
  {
      /* Find out the full path of our executable. */
!     if (my_fullpath(installdir, argv[0], BUFSIZE) == NULL)
      {
        printf("ERROR: Cannot get name of executable\n");
        myexit(1);
--- 512,518 ----
  do_inits(char **argv)
  {
      /* Find out the full path of our executable. */
!     if (my_fullpath(installdir, argv[0], sizeof(installdir)) == NULL)
      {
        printf("ERROR: Cannot get name of executable\n");
        myexit(1);
*** ../vim-8.1.0975/src/uninstal.c      2019-02-18 22:19:29.124186022 +0100
--- src/uninstal.c      2019-02-22 19:33:42.519738742 +0100
***************
*** 60,70 ****
   * Returns non-zero when it's found.
   */
      static int
! popup_gvim_path(char *buf)
  {
      HKEY      key_handle;
      DWORD     value_type;
-     DWORD     bufsize = BUFSIZE;
      int               r;
  
      /* Open the key where the path to gvim.exe is stored. */
--- 60,69 ----
   * Returns non-zero when it's found.
   */
      static int
! popup_gvim_path(char *buf, DWORD bufsize)
  {
      HKEY      key_handle;
      DWORD     value_type;
      int               r;
  
      /* Open the key where the path to gvim.exe is stored. */
***************
*** 87,97 ****
   * Returns non-zero when it's found.
   */
      static int
! openwith_gvim_path(char *buf)
  {
      HKEY      key_handle;
      DWORD     value_type;
-     DWORD     bufsize = BUFSIZE;
      int               r;
  
      /* Open the key where the path to gvim.exe is stored. */
--- 86,95 ----
   * Returns non-zero when it's found.
   */
      static int
! openwith_gvim_path(char *buf, DWORD bufsize)
  {
      HKEY      key_handle;
      DWORD     value_type;
      int               r;
  
      /* Open the key where the path to gvim.exe is stored. */
***************
*** 209,215 ****
      fd = fopen(path, "r");
      if (fd != NULL)
      {
!       while (fgets(line, BUFSIZE, fd) != NULL)
        {
            for (p = line; *p != 0; ++p)
                /* don't accept "vim60an" when looking for "vim60". */
--- 207,213 ----
      fd = fopen(path, "r");
      if (fd != NULL)
      {
!       while (fgets(line, sizeof(line), fd) != NULL)
        {
            for (p = line; *p != 0; ++p)
                /* don't accept "vim60an" when looking for "vim60". */
***************
*** 335,341 ****
  
      printf("This program will remove the following items:\n");
  
!     if (popup_gvim_path(popup_path))
      {
        printf(" - the \"Edit with Vim\" entry in the popup menu\n");
        printf("   which uses \"%s\"\n", popup_path);
--- 333,339 ----
  
      printf("This program will remove the following items:\n");
  
!     if (popup_gvim_path(popup_path, sizeof(popup_path)))
      {
        printf(" - the \"Edit with Vim\" entry in the popup menu\n");
        printf("   which uses \"%s\"\n", popup_path);
***************
*** 349,355 ****
            remove_openwith();
        }
      }
!     else if (openwith_gvim_path(popup_path))
      {
        printf(" - the Vim \"Open With...\" entry in the popup menu\n");
        printf("   which uses \"%s\"\n", popup_path);
--- 347,353 ----
            remove_openwith();
        }
      }
!     else if (openwith_gvim_path(popup_path, sizeof(popup_path)))
      {
        printf(" - the Vim \"Open With...\" entry in the popup menu\n");
        printf("   which uses \"%s\"\n", popup_path);
*** ../vim-8.1.0975/src/version.c       2019-02-22 19:14:46.774074872 +0100
--- src/version.c       2019-02-22 19:34:21.703520330 +0100
***************
*** 781,782 ****
--- 781,784 ----
  {   /* Add new patch number below this line */
+ /**/
+     976,
  /**/

-- 
When a fly lands on the ceiling, does it do a half roll or
a half loop?

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui