# HG changeset patch # User Bram Moolenaar # Date 1586795408 -7200 # Node ID 4c9acbd6b3c7a5f6cd0cd5f760ff8763bce2e117 # Parent 1098dd529613414349bdbcb78a73d522c5b0c6d4 patch 8.2.0573: using :version twice leaks memory Commit: https://github.com/vim/vim/commit/278e83863b2c7329f6712b8809e4aa5e6a50e13f Author: Bram Moolenaar 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) diff --git a/src/globals.h b/src/globals.h --- 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 /* diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak --- 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 \ diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim --- 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 diff --git a/src/testdir/test_version.vim b/src/testdir/test_version.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 diff --git a/src/version.c b/src/version.c --- 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,