Patch 9.0.0733
Problem:    Use of strftime() is not safe.
Solution:   Check the return value of strftime().  Use a larger buffer and
            correctly pass the available space. (Dominique Pellé, closes
            #11348)
Files:      src/time.c


*** ../vim-9.0.0732/src/time.c  2022-10-07 11:20:24.034352636 +0100
--- src/time.c  2022-10-12 13:30:01.530292365 +0100
***************
*** 82,88 ****
      char *
  get_ctime(time_t thetime, int add_newline)
  {
!     static char buf[50];
  #ifdef HAVE_STRFTIME
      struct tm tmval;
      struct tm *curtime;
--- 82,88 ----
      char *
  get_ctime(time_t thetime, int add_newline)
  {
!     static char buf[100];  // hopefully enough for every language
  #ifdef HAVE_STRFTIME
      struct tm tmval;
      struct tm *curtime;
***************
*** 90,101 ****
      curtime = vim_localtime(&thetime, &tmval);
      // MSVC returns NULL for an invalid value of seconds.
      if (curtime == NULL)
!       vim_strncpy((char_u *)buf, (char_u *)_("(Invalid)"), sizeof(buf) - 1);
      else
      {
        // xgettext:no-c-format
!       (void)strftime(buf, sizeof(buf) - 1, _("%a %b %d %H:%M:%S %Y"),
!                                                                   curtime);
  # ifdef MSWIN
        if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
        {
--- 90,109 ----
      curtime = vim_localtime(&thetime, &tmval);
      // MSVC returns NULL for an invalid value of seconds.
      if (curtime == NULL)
!       vim_strncpy((char_u *)buf, (char_u *)_("(Invalid)"), sizeof(buf) - 2);
      else
      {
        // xgettext:no-c-format
!       if (strftime(buf, sizeof(buf) - 2, _("%a %b %d %H:%M:%S %Y"), curtime)
!                                                                         == 0)
!       {
!           // Quoting "man strftime":
!           // > If the length of the result string (including the terminating
!           // > null byte) would exceed max bytes, then strftime() returns 0,
!           // > and the contents of the array are undefined.
!           vim_strncpy((char_u *)buf, (char_u *)_("(Invalid)"),
!                                                             sizeof(buf) - 2);
!       }
  # ifdef MSWIN
        if (enc_codepage >= 0 && (int)GetACP() != enc_codepage)
        {
***************
*** 105,111 ****
            acp_to_enc((char_u *)buf, (int)strlen(buf), &to_free, &len);
            if (to_free != NULL)
            {
!               STRCPY(buf, to_free);
                vim_free(to_free);
            }
        }
--- 113,119 ----
            acp_to_enc((char_u *)buf, (int)strlen(buf), &to_free, &len);
            if (to_free != NULL)
            {
!               STRNCPY(buf, to_free, sizeof(buf) - 2);
                vim_free(to_free);
            }
        }
***************
*** 318,327 ****
        convert_setup(&conv, p_enc, enc);
        if (conv.vc_type != CONV_NONE)
            p = string_convert(&conv, p, NULL);
!       if (p != NULL)
!           (void)strftime((char *)result_buf, sizeof(result_buf),
!                                                         (char *)p, curtime);
!       else
            result_buf[0] = NUL;
  
        if (conv.vc_type != CONV_NONE)
--- 326,333 ----
        convert_setup(&conv, p_enc, enc);
        if (conv.vc_type != CONV_NONE)
            p = string_convert(&conv, p, NULL);
!       if (p == NULL || strftime((char *)result_buf, sizeof(result_buf),
!                                                 (char *)p, curtime) == 0)
            result_buf[0] = NUL;
  
        if (conv.vc_type != CONV_NONE)
***************
*** 1117,1132 ****
  #ifdef HAVE_STRFTIME
      struct tm tmval;
      struct tm *curtime;
  
      if (vim_time() - tt >= 100)
      {
        curtime = vim_localtime(&tt, &tmval);
        if (vim_time() - tt < (60L * 60L * 12L))
            // within 12 hours
!           (void)strftime((char *)buf, buflen, "%H:%M:%S", curtime);
        else
            // longer ago
!           (void)strftime((char *)buf, buflen, "%Y/%m/%d %H:%M:%S", curtime);
      }
      else
  #endif
--- 1123,1141 ----
  #ifdef HAVE_STRFTIME
      struct tm tmval;
      struct tm *curtime;
+     int               n;
  
      if (vim_time() - tt >= 100)
      {
        curtime = vim_localtime(&tt, &tmval);
        if (vim_time() - tt < (60L * 60L * 12L))
            // within 12 hours
!           n = strftime((char *)buf, buflen, "%H:%M:%S", curtime);
        else
            // longer ago
!           n = strftime((char *)buf, buflen, "%Y/%m/%d %H:%M:%S", curtime);
!       if (n == 0)
!           buf[0] = NUL;
      }
      else
  #endif
*** ../vim-9.0.0732/src/version.c       2022-10-12 12:58:50.385618448 +0100
--- src/version.c       2022-10-12 13:28:40.030510098 +0100
***************
*** 701,702 ****
--- 701,704 ----
  {   /* Add new patch number below this line */
+ /**/
+     733,
  /**/

-- 
-rwxr-xr-x  1 root          24 Oct 29  1929 /bin/ed
-rwxr-xr-t  4 root      131720 Jan  1  1970 /usr/ucb/vi
-rwxr-xr-x  1 root  5.89824e37 Oct 22  1990 /usr/bin/emacs

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20221012123434.AC3C71C5296%40moolenaar.net.

Raspunde prin e-mail lui