changeset 9347:25c562442f8c v7.4.1955

commit https://github.com/vim/vim/commit/f4fba6dcd508cb369ffa6916d9cb3fcf3d7ed548 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jun 26 16:44:24 2016 +0200 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)
author Christian Brabandt <cb@256bit.org>
date Sun, 26 Jun 2016 16:45:05 +0200
parents 14bbb4a8b05d
children fc80cc404acc
files src/ex_cmds.c src/globals.h src/misc2.c src/proto/ex_cmds.pro src/proto/misc2.pro src/structs.h src/version.c src/vim.h
diffstat 8 files changed, 35 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -2850,7 +2850,7 @@ write_viminfo_barlines(vir_T *virp, FILE
  * Return the current time in seconds.  Calls time(), unless test_settime()
  * was used.
  */
-    time_t
+    time_T
 vim_time(void)
 {
 # ifdef FEAT_EVAL
--- a/src/globals.h
+++ b/src/globals.h
@@ -1608,7 +1608,7 @@ EXTERN int xsmp_icefd INIT(= -1);   /* T
 #endif
 
 /* For undo we need to know the lowest time possible. */
-EXTERN time_t starttime;
+EXTERN time_T starttime;
 
 #ifdef STARTUPTIME
 EXTERN FILE *time_fd INIT(= NULL);  /* where to write startup timing */
@@ -1640,7 +1640,7 @@ EXTERN int  did_add_timer INIT(= FALSE);
 #endif
 
 #ifdef FEAT_EVAL
-EXTERN time_t time_for_testing INIT(= 0);
+EXTERN time_T time_for_testing INIT(= 0);
 #endif
 
 /*
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -6070,12 +6070,12 @@ get4c(FILE *fd)
 }
 
 /*
- * Read 8 bytes from "fd" and turn them into a time_t, MSB first.
+ * Read 8 bytes from "fd" and turn them into a time_T, MSB first.
  */
-    time_t
+    time_T
 get8ctime(FILE *fd)
 {
-    time_t	n = 0;
+    time_T	n = 0;
     int		i;
 
     for (i = 0; i < 8; ++i)
@@ -6137,11 +6137,11 @@ put_bytes(FILE *fd, long_u nr, int len)
 #endif
 
 /*
- * Write time_t to file "fd" in 8 bytes.
+ * Write time_T to file "fd" in 8 bytes.
  * Returns FAIL when the write failed.
  */
     int
-put_time(FILE *fd, time_t the_time)
+put_time(FILE *fd, time_T the_time)
 {
     char_u	buf[8];
 
@@ -6150,26 +6150,26 @@ put_time(FILE *fd, time_t the_time)
 }
 
 /*
- * Write time_t to "buf[8]".
+ * Write time_T to "buf[8]".
  */
     void
-time_to_bytes(time_t the_time, char_u *buf)
+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
+    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,
+     * 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))
+	if (i + 1 > (int)sizeof(time_T))
 	    /* ">>" doesn't work well when shifting more bits than avail */
 	    buf[bi++] = 0;
 	else
--- a/src/proto/ex_cmds.pro
+++ b/src/proto/ex_cmds.pro
@@ -17,7 +17,7 @@ int viminfo_readline(vir_T *virp);
 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);
+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);
--- a/src/proto/misc2.pro
+++ b/src/proto/misc2.pro
@@ -103,11 +103,11 @@ int emsgn(char_u *s, long n);
 int get2c(FILE *fd);
 int get3c(FILE *fd);
 int get4c(FILE *fd);
-time_t get8ctime(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 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 : */
--- a/src/structs.h
+++ b/src/structs.h
@@ -113,7 +113,7 @@ typedef struct xfilemark
     fmark_T	fmark;
     char_u	*fname;		/* file name, used when fnum == 0 */
 #ifdef FEAT_VIMINFO
-    time_t	time_set;
+    time_T	time_set;
 #endif
 } xfmark_T;
 
@@ -358,7 +358,7 @@ struct u_header
     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 */
+    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,7 +1816,7 @@ struct file_buffer
     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 */
+    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 */
 
     /*
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1955,
+/**/
     1954,
 /**/
     1953,
--- a/src/vim.h
+++ b/src/vim.h
@@ -1761,6 +1761,17 @@ typedef struct timeval proftime_T;
 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