diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-06-26 16:44:24 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-06-26 16:44:24 +0200 |
commit | f4fba6dcd508cb369ffa6916d9cb3fcf3d7ed548 (patch) | |
tree | eadfcc55dff51f143e33a228f91c9c60302fbd20 | |
parent | d388d2ac8bf8c770bf97dc406e99a20ba5104855 (diff) | |
download | vim-git-f4fba6dcd508cb369ffa6916d9cb3fcf3d7ed548.tar.gz |
patch 7.4.1955v7.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)
-rw-r--r-- | src/ex_cmds.c | 2 | ||||
-rw-r--r-- | src/globals.h | 4 | ||||
-rw-r--r-- | src/misc2.c | 22 | ||||
-rw-r--r-- | src/proto/ex_cmds.pro | 2 | ||||
-rw-r--r-- | src/proto/misc2.pro | 6 | ||||
-rw-r--r-- | src/structs.h | 6 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 11 |
8 files changed, 34 insertions, 21 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c index aff2bddca..f58bad7be 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -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 diff --git a/src/globals.h b/src/globals.h index f5e1bb132..f14cb89a9 100644 --- a/src/globals.h +++ b/src/globals.h @@ -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 /* diff --git a/src/misc2.c b/src/misc2.c index 67486aae3..1018e4b06 100644 --- 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 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 diff --git a/src/proto/ex_cmds.pro b/src/proto/ex_cmds.pro index bc624bf2f..b3713140c 100644 --- 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); diff --git a/src/proto/misc2.pro b/src/proto/misc2.pro index 676eb9570..573dee559 100644 --- 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 : */ diff --git a/src/structs.h b/src/structs.h index 6075ee2e0..fd8aaa12b 100644 --- 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 */ /* diff --git a/src/version.c b/src/version.c index 78f862991..2df5c3614 100644 --- 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, @@ -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 |