diff options
author | ZyX <kp-pav@yandex.ru> | 2016-03-07 07:50:17 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2016-04-18 02:48:20 +0300 |
commit | 52c6cc21899d0d5bf0dffc2cee849063e176e931 (patch) | |
tree | 7739e2ab3ce40c439821faf72fa4dc88b9529972 /test/unit/eval/decode_spec.lua | |
parent | 224d7df6309319cfa1f98aad3aa93c5b63ee4145 (diff) | |
download | rneovim-52c6cc21899d0d5bf0dffc2cee849063e176e931.tar.gz rneovim-52c6cc21899d0d5bf0dffc2cee849063e176e931.tar.bz2 rneovim-52c6cc21899d0d5bf0dffc2cee849063e176e931.zip |
eval/decode: Make sure that parsing strings does not overflow
Diffstat (limited to 'test/unit/eval/decode_spec.lua')
-rw-r--r-- | test/unit/eval/decode_spec.lua | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/test/unit/eval/decode_spec.lua b/test/unit/eval/decode_spec.lua index 6ae000a00a..2bf7f0b987 100644 --- a/test/unit/eval/decode_spec.lua +++ b/test/unit/eval/decode_spec.lua @@ -18,12 +18,16 @@ local decode = cimport('./src/nvim/eval/decode.h', './src/nvim/eval_defs.h', describe('json_decode_string()', function() after_each(function() decode.emsg_silent = 0 + decode.trylevel = 0 end) + local char = function(c) + return ffi.gc(decode.xmemdup(c, 1), decode.xfree) + end + it('does not overflow when running with `n…`, `t…`, `f…`', function() - local rettv = ffi.new('typval_T') + local rettv = ffi.new('typval_T', {v_type=decode.VAR_UNKNOWN}) decode.emsg_silent = 1 - rettv.v_type = decode.VAR_UNKNOWN -- This will not crash, but if `len` argument will be ignored it will parse -- `null` as `null` and if not it will parse `null` as `n`. eq(0, decode.json_decode_string('null', 1, rettv)) @@ -49,12 +53,8 @@ describe('json_decode_string()', function() end) it('does not overflow and crash when running with `n`, `t`, `f`', function() - local rettv = ffi.new('typval_T') + local rettv = ffi.new('typval_T', {v_type=decode.VAR_UNKNOWN}) decode.emsg_silent = 1 - rettv.v_type = decode.VAR_UNKNOWN - local char = function(c) - return ffi.gc(decode.xmemdup(c, 1), decode.xfree) - end eq(0, decode.json_decode_string(char('n'), 1, rettv)) eq(decode.VAR_UNKNOWN, rettv.v_type) eq(0, decode.json_decode_string(char('t'), 1, rettv)) @@ -62,4 +62,19 @@ describe('json_decode_string()', function() eq(0, decode.json_decode_string(char('f'), 1, rettv)) eq(decode.VAR_UNKNOWN, rettv.v_type) end) + + it('does not overflow when running with `"…`', function() + local rettv = ffi.new('typval_T', {v_type=decode.VAR_UNKNOWN}) + decode.emsg_silent = 1 + eq(0, decode.json_decode_string('"t"', 2, rettv)) + eq(decode.VAR_UNKNOWN, rettv.v_type) + eq(0, decode.json_decode_string('""', 1, rettv)) + eq(decode.VAR_UNKNOWN, rettv.v_type) + end) + + it('does not overflow and crash when running with `"`', function() + local rettv = ffi.new('typval_T', {v_type=decode.VAR_UNKNOWN}) + eq(0, decode.json_decode_string(char('"'), 1, rettv)) + eq(decode.VAR_UNKNOWN, rettv.v_type) + end) end) |