Patch 7.4.1955
Problem:    Using 32-bit Perl with 64-bit time_t causes memory corruption.
            (Christian Brabandt)
Solution:   Use time_T instead of time_t for global variables. (Ken Takata)
Files:      src/ex_cmds.c, src/globals.h, src/misc2.c, src/proto/ex_cmds.pro,
            src/proto/misc2.pro, src/structs.h, src/vim.h


*** ../vim-7.4.1954/src/ex_cmds.c       2016-06-20 12:50:11.863811251 +0200
--- src/ex_cmds.c       2016-06-26 16:29:19.875494469 +0200
***************
*** 2850,2856 ****
   * Return the current time in seconds.  Calls time(), unless test_settime()
   * was used.
   */
!     time_t
  vim_time(void)
  {
  # ifdef FEAT_EVAL
--- 2850,2856 ----
   * Return the current time in seconds.  Calls time(), unless test_settime()
   * was used.
   */
!     time_T
  vim_time(void)
  {
  # ifdef FEAT_EVAL
*** ../vim-7.4.1954/src/globals.h       2016-06-06 21:07:48.387578685 +0200
--- src/globals.h       2016-06-26 16:29:19.879494399 +0200
***************
*** 1608,1614 ****
  #endif
  
  /* For undo we need to know the lowest time possible. */
! EXTERN time_t starttime;
  
  #ifdef STARTUPTIME
  EXTERN FILE *time_fd INIT(= NULL);  /* where to write startup timing */
--- 1608,1614 ----
  #endif
  
  /* For undo we need to know the lowest time possible. */
! EXTERN time_T starttime;
  
  #ifdef STARTUPTIME
  EXTERN FILE *time_fd INIT(= NULL);  /* where to write startup timing */
***************
*** 1640,1646 ****
  #endif
  
  #ifdef FEAT_EVAL
! EXTERN time_t time_for_testing INIT(= 0);
  #endif
  
  /*
--- 1640,1646 ----
  #endif
  
  #ifdef FEAT_EVAL
! EXTERN time_T time_for_testing INIT(= 0);
  #endif
  
  /*
*** ../vim-7.4.1954/src/misc2.c 2016-06-08 21:17:39.053193558 +0200
--- src/misc2.c 2016-06-26 16:29:19.879494399 +0200
***************
*** 6070,6081 ****
  }
  
  /*
!  * Read 8 bytes from "fd" and turn them into a time_t, MSB first.
   */
!     time_t
  get8ctime(FILE *fd)
  {
!     time_t    n = 0;
      int               i;
  
      for (i = 0; i < 8; ++i)
--- 6070,6081 ----
  }
  
  /*
!  * Read 8 bytes from "fd" and turn them into a time_T, MSB first.
   */
!     time_T
  get8ctime(FILE *fd)
  {
!     time_T    n = 0;
      int               i;
  
      for (i = 0; i < 8; ++i)
***************
*** 6137,6147 ****
  #endif
  
  /*
!  * Write time_t to file "fd" in 8 bytes.
   * Returns FAIL when the write failed.
   */
      int
! put_time(FILE *fd, time_t the_time)
  {
      char_u    buf[8];
  
--- 6137,6147 ----
  #endif
  
  /*
!  * Write time_T to file "fd" in 8 bytes.
   * Returns FAIL when the write failed.
   */
      int
! put_time(FILE *fd, time_T the_time)
  {
      char_u    buf[8];
  
***************
*** 6150,6175 ****
  }
  
  /*
!  * Write time_t to "buf[8]".
   */
      void
! time_to_bytes(time_t the_time, char_u *buf)
  {
      int               c;
      int               i;
      int               bi = 0;
!     time_t    wtime = the_time;
  
!     /* time_t can be up to 8 bytes in size, more than long_u, thus we
       * can't use put_bytes() here.
       * Another problem is that ">>" may do an arithmetic shift that keeps the
       * sign.  This happens for large values of wtime.  A cast to long_u may
!      * truncate if time_t is 8 bytes.  So only use a cast when it is 4 bytes,
       * it's safe to assume that long_u is 4 bytes or more and when using 8
       * bytes the top bit won't be set. */
      for (i = 7; i >= 0; --i)
      {
!       if (i + 1 > (int)sizeof(time_t))
            /* ">>" doesn't work well when shifting more bits than avail */
            buf[bi++] = 0;
        else
--- 6150,6175 ----
  }
  
  /*
!  * Write time_T to "buf[8]".
   */
      void
! time_to_bytes(time_T the_time, char_u *buf)
  {
      int               c;
      int               i;
      int               bi = 0;
!     time_T    wtime = the_time;
  
!     /* time_T can be up to 8 bytes in size, more than long_u, thus we
       * can't use put_bytes() here.
       * Another problem is that ">>" may do an arithmetic shift that keeps the
       * sign.  This happens for large values of wtime.  A cast to long_u may
!      * truncate if time_T is 8 bytes.  So only use a cast when it is 4 bytes,
       * it's safe to assume that long_u is 4 bytes or more and when using 8
       * bytes the top bit won't be set. */
      for (i = 7; i >= 0; --i)
      {
!       if (i + 1 > (int)sizeof(time_T))
            /* ">>" doesn't work well when shifting more bits than avail */
            buf[bi++] = 0;
        else
*** ../vim-7.4.1954/src/proto/ex_cmds.pro       2016-06-11 21:04:34.927761279 
+0200
--- src/proto/ex_cmds.pro       2016-06-26 16:29:19.879494399 +0200
***************
*** 17,23 ****
  char_u *viminfo_readstring(vir_T *virp, int off, int convert);
  void viminfo_writestring(FILE *fd, char_u *p);
  int barline_writestring(FILE *fd, char_u *s, int remaining_start);
! time_t vim_time(void);
  void do_fixdel(exarg_T *eap);
  void print_line_no_prefix(linenr_T lnum, int use_number, int list);
  void print_line(linenr_T lnum, int use_number, int list);
--- 17,23 ----
  char_u *viminfo_readstring(vir_T *virp, int off, int convert);
  void viminfo_writestring(FILE *fd, char_u *p);
  int barline_writestring(FILE *fd, char_u *s, int remaining_start);
! time_T vim_time(void);
  void do_fixdel(exarg_T *eap);
  void print_line_no_prefix(linenr_T lnum, int use_number, int list);
  void print_line(linenr_T lnum, int use_number, int list);
*** ../vim-7.4.1954/src/proto/misc2.pro 2016-01-19 13:21:55.845334290 +0100
--- src/proto/misc2.pro 2016-06-26 16:29:19.879494399 +0200
***************
*** 103,113 ****
  int get2c(FILE *fd);
  int get3c(FILE *fd);
  int get4c(FILE *fd);
! time_t get8ctime(FILE *fd);
  char_u *read_string(FILE *fd, int cnt);
  int put_bytes(FILE *fd, long_u nr, int len);
! int put_time(FILE *fd, time_t the_time);
! void time_to_bytes(time_t the_time, char_u *buf);
  int has_non_ascii(char_u *s);
  void parse_queued_messages(void);
  /* vim: set ft=c : */
--- 103,113 ----
  int get2c(FILE *fd);
  int get3c(FILE *fd);
  int get4c(FILE *fd);
! time_T get8ctime(FILE *fd);
  char_u *read_string(FILE *fd, int cnt);
  int put_bytes(FILE *fd, long_u nr, int len);
! int put_time(FILE *fd, time_T the_time);
! void time_to_bytes(time_T the_time, char_u *buf);
  int has_non_ascii(char_u *s);
  void parse_queued_messages(void);
  /* vim: set ft=c : */
*** ../vim-7.4.1954/src/structs.h       2016-06-12 21:20:50.941837428 +0200
--- src/structs.h       2016-06-26 16:29:19.879494399 +0200
***************
*** 113,119 ****
      fmark_T   fmark;
      char_u    *fname;         /* file name, used when fnum == 0 */
  #ifdef FEAT_VIMINFO
!     time_t    time_set;
  #endif
  } xfmark_T;
  
--- 113,119 ----
      fmark_T   fmark;
      char_u    *fname;         /* file name, used when fnum == 0 */
  #ifdef FEAT_VIMINFO
!     time_T    time_set;
  #endif
  } xfmark_T;
  
***************
*** 358,364 ****
      int               uh_flags;       /* see below */
      pos_T     uh_namedm[NMARKS];      /* marks before undo/after redo */
      visualinfo_T uh_visual;   /* Visual areas before undo/after redo */
!     time_t    uh_time;        /* timestamp when the change was made */
      long      uh_save_nr;     /* set when the file was saved after the
                                   changes in this block */
  #ifdef U_DEBUG
--- 358,364 ----
      int               uh_flags;       /* see below */
      pos_T     uh_namedm[NMARKS];      /* marks before undo/after redo */
      visualinfo_T uh_visual;   /* Visual areas before undo/after redo */
!     time_T    uh_time;        /* timestamp when the change was made */
      long      uh_save_nr;     /* set when the file was saved after the
                                   changes in this block */
  #ifdef U_DEBUG
***************
*** 1816,1822 ****
      long      b_u_seq_last;   /* last used undo sequence number */
      long      b_u_save_nr_last; /* counter for last file write */
      long      b_u_seq_cur;    /* hu_seq of header below which we are now */
!     time_t    b_u_time_cur;   /* uh_time of header below which we are now */
      long      b_u_save_nr_cur; /* file write nr after which we are now */
  
      /*
--- 1816,1822 ----
      long      b_u_seq_last;   /* last used undo sequence number */
      long      b_u_save_nr_last; /* counter for last file write */
      long      b_u_seq_cur;    /* hu_seq of header below which we are now */
!     time_T    b_u_time_cur;   /* uh_time of header below which we are now */
      long      b_u_save_nr_cur; /* file write nr after which we are now */
  
      /*
*** ../vim-7.4.1954/src/vim.h   2016-06-12 21:20:50.941837428 +0200
--- src/vim.h   2016-06-26 16:31:47.084889008 +0200
***************
*** 1761,1766 ****
--- 1761,1777 ----
  typedef int proftime_T;           /* dummy for function prototypes */
  #endif
  
+ /*
+  * When compiling with 32 bit Perl time_t is 32 bits in the Perl code but 64
+  * bits elsewhere.  That causes memory corruption.  Define time_T and use it
+  * for global variables to avoid that.
+  */
+ #ifdef WIN3264
+ typedef __time64_t  time_T;
+ #else
+ typedef time_t            time_T;
+ #endif
+ 
  #ifdef _WIN64
  typedef __int64 sock_T;
  #else
*** ../vim-7.4.1954/src/version.c       2016-06-26 16:24:01.285129401 +0200
--- src/version.c       2016-06-26 16:30:02.726736152 +0200
***************
*** 755,756 ****
--- 755,758 ----
  {   /* Add new patch number below this line */
+ /**/
+     1955,
  /**/

-- 
Why is it called "Windows"?  "Gates" would be more appropriate...

 /// 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