diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2014-10-26 20:03:02 +0000 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2014-10-26 20:03:02 +0000 |
commit | 49d5ed55914b5af32abcb87b6b422f880dc1d0d0 (patch) | |
tree | 39011f1f5c655b73c35465f74b9428ba9df34c10 | |
parent | 3fc542b45bc6b3b826f7c2eabffe1ede3cb7afbf (diff) | |
download | rneovim-49d5ed55914b5af32abcb87b6b422f880dc1d0d0.tar.gz rneovim-49d5ed55914b5af32abcb87b6b422f880dc1d0d0.tar.bz2 rneovim-49d5ed55914b5af32abcb87b6b422f880dc1d0d0.zip |
fix #1027: :wundo segfault in new, non-empty buffer
-rw-r--r-- | src/nvim/undo.c | 7 | ||||
-rw-r--r-- | test/functional/ex_cmds/wundo_spec.lua | 20 |
2 files changed, 24 insertions, 3 deletions
diff --git a/src/nvim/undo.c b/src/nvim/undo.c index fe782053a7..7a57f70498 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -1009,7 +1009,7 @@ void u_write_undo(char_u *name, int forceit, buf_T *buf, char_u *hash) int fd; FILE *fp = NULL; int perm; - int write_ok = FALSE; + bool write_ok = false; if (name == NULL) { file_name = u_get_undo_file_name(buf->b_ffname, FALSE); @@ -1116,7 +1116,8 @@ void u_write_undo(char_u *name, int forceit, buf_T *buf, char_u *hash) */ FileInfo file_info_old; FileInfo file_info_new; - if (os_fileinfo((char *)buf->b_ffname, &file_info_old) + if (buf->b_ffname != NULL + && os_fileinfo((char *)buf->b_ffname, &file_info_old) && os_fileinfo((char *)file_name, &file_info_new) && file_info_old.stat.st_gid != file_info_new.stat.st_gid && os_fchown(fd, -1, file_info_old.stat.st_gid) != 0) { @@ -1177,7 +1178,7 @@ void u_write_undo(char_u *name, int forceit, buf_T *buf, char_u *hash) } if (put_bytes(fp, (long_u)UF_HEADER_END_MAGIC, 2) == OK) - write_ok = TRUE; + write_ok = true; #ifdef U_DEBUG if (headers_written != buf->b_u_numhead) { EMSGN("Written %" PRId64 " headers, ...", headers_written); diff --git a/test/functional/ex_cmds/wundo_spec.lua b/test/functional/ex_cmds/wundo_spec.lua new file mode 100644 index 0000000000..d8bd8a7031 --- /dev/null +++ b/test/functional/ex_cmds/wundo_spec.lua @@ -0,0 +1,20 @@ +-- Specs for +-- :wundo + +local helpers = require('test.functional.helpers') +local execute, eq, clear, eval, feed = + helpers.execute, helpers.eq, helpers.clear, helpers.eval, helpers.feed + + +describe(':wundo', function() + before_each(clear) + + it('safely fails on new, non-empty buffer', function() + feed('iabc<esc>') + execute('wundo foo') -- This should not segfault. #1027 + --TODO: check messages for error message + + os.remove(eval('getcwd()') .. '/foo') --cleanup + end) + +end) |