aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/eval/typval_encode.h
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2016-12-25 23:29:35 +0300
committerZyX <kp-pav@yandex.ru>2017-01-03 06:39:23 +0300
commit759e736b0ab03034dc61d6a30e1b8b1f17ed9695 (patch)
tree92da5c50e05040dbcad881c270ebade0ca1fc502 /src/nvim/eval/typval_encode.h
parentaffa3c2baa60acbffd32234326d38cced2d3f30c (diff)
downloadrneovim-759e736b0ab03034dc61d6a30e1b8b1f17ed9695.tar.gz
rneovim-759e736b0ab03034dc61d6a30e1b8b1f17ed9695.tar.bz2
rneovim-759e736b0ab03034dc61d6a30e1b8b1f17ed9695.zip
eval/typval_encode: Fix infinite loop
Occurs when trying to dump a partial with attached self dictionary which references that partial. “Infinite” loop should normally result in Neovim killed by OOM killer. Also moved the place when partials are unreferenced by clear_tv: from …FUNC_START to …FUNC_END.
Diffstat (limited to 'src/nvim/eval/typval_encode.h')
-rw-r--r--src/nvim/eval/typval_encode.h22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/nvim/eval/typval_encode.h b/src/nvim/eval/typval_encode.h
index 8fb37de93e..9208cdc752 100644
--- a/src/nvim/eval/typval_encode.h
+++ b/src/nvim/eval/typval_encode.h
@@ -249,16 +249,26 @@ static inline size_t tv_strlen(const typval_T *const tv)
/// copyID (variable) it is set to copyID.
/// @param[in] copyID CopyID used by the caller.
/// @param conv_type Type of the conversion, @see MPConvStackValType.
-#define _TYPVAL_ENCODE_CHECK_SELF_REFERENCE(val, copyID_attr, copyID, \
- conv_type) \
+#define _TYPVAL_ENCODE_DO_CHECK_SELF_REFERENCE(val, copyID_attr, copyID, \
+ conv_type) \
do { \
- if ((val)->copyID_attr == (copyID)) { \
- TYPVAL_ENCODE_CONV_RECURSE((val), conv_type); \
- return OK; \
+ const int te_csr_ret = _TYPVAL_ENCODE_CHECK_SELF_REFERENCE( \
+ TYPVAL_ENCODE_FIRST_ARG_NAME, \
+ (val), &(val)->copyID_attr, mpstack, copyID, conv_type, objname); \
+ if (te_csr_ret != NOTDONE) { \
+ return te_csr_ret; \
} \
- (val)->copyID_attr = (copyID); \
} while (0)
+#define _TYPVAL_ENCODE_CHECK_SELF_REFERENCE_INNER_2(name) \
+ _typval_encode_##name##_check_self_reference
+#define _TYPVAL_ENCODE_CHECK_SELF_REFERENCE_INNER(name) \
+ _TYPVAL_ENCODE_CHECK_SELF_REFERENCE_INNER_2(name)
+
+/// Self reference checker function name
+#define _TYPVAL_ENCODE_CHECK_SELF_REFERENCE \
+ _TYPVAL_ENCODE_CHECK_SELF_REFERENCE_INNER(TYPVAL_ENCODE_NAME)
+
#define _TYPVAL_ENCODE_ENCODE_INNER_2(name) encode_vim_to_##name
#define _TYPVAL_ENCODE_ENCODE_INNER(name) _TYPVAL_ENCODE_ENCODE_INNER_2(name)