From 4e3a2784ec3cb4ff79bd48f55a8edee817dec6e7 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Mon, 6 Mar 2017 12:14:39 -0500 Subject: [PATCH] vim-patch:7.4.2068 Problem: Not all arguments of trunc_string() are tested. Memory access error when running the message tests. Solution: Add another test case. (Yegappan Lakshmanan) Make it easy to run unittests with valgrind. Fix the access error. https://github.com/vim/vim/commit/b9644433d2728e99fab874e5e33147ad95d23a31 --- src/nvim/message.c | 4 ++-- src/nvim/version.c | 2 +- test/unit/message_spec.lua | 28 +++++++++++++++++++--------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/nvim/message.c b/src/nvim/message.c index 57f7369e73..689e8893bd 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -274,9 +274,9 @@ void trunc_string(char_u *s, char_u *buf, int room, int buflen) for (;;) { do { half = half - (*mb_head_off)(s, s + half - 1) - 1; - } while (utf_iscomposing(utf_ptr2char(s + half)) && half > 0); + } while (half > 0 && utf_iscomposing(utf_ptr2char(s + half))); n = ptr2cells(s + half); - if (len + n > room) { + if (len + n > room || half == 0) { break; } len += n; diff --git a/src/nvim/version.c b/src/nvim/version.c index b755404a58..abd3b7dfc3 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -372,7 +372,7 @@ static int included_patches[] = { 2071, // 2070 NA // 2069, - // 2068, + 2068, 2067, 2066, 2065, diff --git a/test/unit/message_spec.lua b/test/unit/message_spec.lua index 23d342c027..afb572347f 100644 --- a/test/unit/message_spec.lua +++ b/test/unit/message_spec.lua @@ -4,22 +4,28 @@ local ffi = helpers.ffi local eq = helpers.eq local to_cstr = helpers.to_cstr -local cimp = helpers.cimport('./src/nvim/message.h') +local cimp = helpers.cimport('./src/nvim/message.h', './src/nvim/memory.h', + './src/nvim/strings.h') describe('trunc_string', function() - local buffer = ffi.typeof('char_u[40]') - - local function test_inplace(s, expected) - local buf = buffer() + local buflen = 40 + local function test_inplace(s, expected, room) + room = room and room or 20 + local buf = cimp.xmalloc(ffi.sizeof('char_u') * buflen) ffi.C.strcpy(buf, s) - cimp.trunc_string(buf, buf, 20, 40) + cimp.trunc_string(buf, buf, room, buflen) eq(expected, ffi.string(buf)) + cimp.xfree(buf) end - local function test_copy(s, expected) - local buf = buffer() - cimp.trunc_string(to_cstr(s), buf, 20, 40) + local function test_copy(s, expected, room) + room = room and room or 20 + local buf = cimp.xmalloc(ffi.sizeof('char_u') * buflen) + local str = cimp.vim_strsave(to_cstr(s)) + cimp.trunc_string(str, buf, room, buflen) eq(expected, ffi.string(buf)) + cimp.xfree(buf) + cimp.xfree(str) end local permutations = { @@ -37,6 +43,10 @@ describe('trunc_string', function() t.func('a short text', 'a short text') end) + it('with a string of length == 1/2 room', function() + t.func('a text that fits', 'a text that fits', 34) + end) + it('with a string exactly the truncate size', function() t.func('a text tha just fits', 'a text tha just fits') end)