changeset 20035:4c9acbd6b3c7 v8.2.0573

patch 8.2.0573: using :version twice leaks memory Commit: https://github.com/vim/vim/commit/278e83863b2c7329f6712b8809e4aa5e6a50e13f Author: Bram Moolenaar <Bram@vim.org> Date: Mon Apr 13 18:25:33 2020 +0200 patch 8.2.0573: using :version twice leaks memory Problem: using :version twice leaks memory Solution: Only initialize variables once. (Dominique Pelle, closes https://github.com/vim/vim/issues/5917)
author Bram Moolenaar <Bram@vim.org>
date Mon, 13 Apr 2020 18:30:08 +0200
parents 1098dd529613
children d34b41f253f9
files src/globals.h src/testdir/Make_all.mak src/testdir/test_alot.vim src/testdir/test_version.vim src/version.c
diffstat 5 files changed, 30 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/globals.h
+++ b/src/globals.h
@@ -1258,7 +1258,7 @@ extern char *Version;
 #if defined(HAVE_DATE_TIME) && defined(VMS) && defined(VAXC)
 extern char longVersion[];
 #else
-EXTERN char *longVersion;
+EXTERN char *longVersion INIT(= NULL);
 #endif
 
 /*
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -285,6 +285,7 @@ NEW_TESTS = \
 	test_utf8 \
 	test_utf8_comparisons \
 	test_vartabs \
+	test_version \
 	$(TEST_VIM9) \
 	test_viminfo \
 	test_vimscript \
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -32,4 +32,5 @@ source test_tabline.vim
 source test_tagcase.vim
 source test_tagfunc.vim
 source test_unlet.vim
+source test_version.vim
 source test_wnext.vim
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_version.vim
@@ -0,0 +1,10 @@
+" Test :version Ex command
+
+func Test_version()
+  " version should always return the same string.
+  let v1 = execute('version')
+  let v2 = execute('version')
+  call assert_equal(v1, v2)
+
+  call assert_match("^\n\nVIM - Vi IMproved .*", v1)
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -54,19 +54,22 @@ init_longVersion(void)
     void
 init_longVersion(void)
 {
-    char *date_time = __DATE__ " " __TIME__;
-    char *msg = _("%s (%s, compiled %s)");
-    size_t len = strlen(msg)
-		+ strlen(VIM_VERSION_LONG_ONLY)
-		+ strlen(VIM_VERSION_DATE_ONLY)
-		+ strlen(date_time);
+    if (longVersion == NULL)
+    {
+	char *date_time = __DATE__ " " __TIME__;
+	char *msg = _("%s (%s, compiled %s)");
+	size_t len = strlen(msg)
+		    + strlen(VIM_VERSION_LONG_ONLY)
+		    + strlen(VIM_VERSION_DATE_ONLY)
+		    + strlen(date_time);
 
-    longVersion = alloc(len);
-    if (longVersion == NULL)
-	longVersion = VIM_VERSION_LONG;
-    else
-	vim_snprintf(longVersion, len, msg,
-		      VIM_VERSION_LONG_ONLY, VIM_VERSION_DATE_ONLY, date_time);
+	longVersion = alloc(len);
+	if (longVersion == NULL)
+	    longVersion = VIM_VERSION_LONG;
+	else
+	    vim_snprintf(longVersion, len, msg,
+			  VIM_VERSION_LONG_ONLY, VIM_VERSION_DATE_ONLY, date_time);
+    }
 }
 # endif
 #else
@@ -739,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    573,
+/**/
     572,
 /**/
     571,