]> granicus.if.org Git - vim/commitdiff
patch 7.4.1955 v7.4.1955
authorBram Moolenaar <Bram@vim.org>
Sun, 26 Jun 2016 14:44:24 +0000 (16:44 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 26 Jun 2016 14:44:24 +0000 (16:44 +0200)
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)

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

index aff2bddcae27ecf1e28aeb853ae954fd9027aa01..f58bad7be13fd3671ff572889a6a6f3251f31fb3 100644 (file)
@@ -2850,7 +2850,7 @@ write_viminfo_barlines(vir_T *virp, FILE *fp_out)
  * Return the current time in seconds.  Calls time(), unless test_settime()
  * was used.
  */
-    time_t
+    time_T
 vim_time(void)
 {
 # ifdef FEAT_EVAL
index f5e1bb1321c7adc92d7c58aab3958a8fb535e3ec..f14cb89a923bf1d9d4bb8198380629e89636350b 100644 (file)
@@ -1608,7 +1608,7 @@ EXTERN int xsmp_icefd INIT(= -1);   /* The actual connection */
 #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
 
 /*
index 67486aae346eeabf83a1323b6b77aed07318c954..1018e4b066c9e318ca80b89f3e1c4a622eb5abca 100644 (file)
@@ -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     wtime = the_time;
 
-    /* time_t can be up to 8 bytes in size, more than long_u, thus we
+    /* 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
index bc624bf2f1fb12cd6d99ef120574a567a6dc7b76..b3713140c04d588b260aedc738103f198e318e8a 100644 (file)
@@ -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);
index 676eb95700c6b21d762a3271521b356d0f26fde9..573dee559e2caf09fb4cabbee6aff7b4392bbb2b 100644 (file)
@@ -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 : */
index 6075ee2e0a1493844c63a03345d9f449e27564de..fd8aaa12b6ffeb4a40ee9388956be71f29d61e4a 100644 (file)
@@ -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 */
 
     /*
index 78f8629915c7ca1dd72d08971cb189c061d8933a..2df5c361433d99f91fa6b8f677582fb41c99a8d1 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1955,
 /**/
     1954,
 /**/
index 7c933d5976016e74075d67c4fbb1dcc827ee1ea7..88a28d4316a27544f0b6438e65f82d1863848a85 100644 (file)
--- 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