aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjörn Linse <bjorn.linse@gmail.com>2019-05-18 14:33:14 +0200
committerGitHub <noreply@github.com>2019-05-18 14:33:14 +0200
commit8e22c4510eb9220f7ead6493fdcfdd7bf1f53d3b (patch)
tree4f247ff9bfffdc09520954fa0269c51bdb9f6850
parent5625c7d8e16475b8732f0aa0238ffd6154446c09 (diff)
parentb247c6fd225566bdae2f31ad85d3a822cf3f1254 (diff)
downloadrneovim-8e22c4510eb9220f7ead6493fdcfdd7bf1f53d3b.tar.gz
rneovim-8e22c4510eb9220f7ead6493fdcfdd7bf1f53d3b.tar.bz2
rneovim-8e22c4510eb9220f7ead6493fdcfdd7bf1f53d3b.zip
Merge pull request #10025 from bfredl/bufhl_fixes
kbtree: pointer UB and unitialized value fixes
-rw-r--r--src/nvim/lib/kbtree.h17
1 files changed, 12 insertions, 5 deletions
diff --git a/src/nvim/lib/kbtree.h b/src/nvim/lib/kbtree.h
index e2688064a8..ad6ff9cdb9 100644
--- a/src/nvim/lib/kbtree.h
+++ b/src/nvim/lib/kbtree.h
@@ -317,7 +317,7 @@
#define __KB_ITR(name, key_t, kbnode_t) \
static inline void kb_itr_first_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
{ \
- itr->p = 0; \
+ itr->p = NULL; \
if (b->n_keys == 0) return; \
itr->p = itr->stack; \
itr->p->x = b->root; itr->p->i = 0; \
@@ -329,7 +329,7 @@
} \
static inline int kb_itr_next_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
{ \
- if (itr->p < itr->stack) return 0; \
+ if (itr->p == NULL) return 0; \
for (;;) { \
++itr->p->i; \
while (itr->p->x && itr->p->i <= itr->p->x->n) { \
@@ -337,22 +337,28 @@
itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[itr->p->i] : 0; \
++itr->p; \
} \
+ if (itr->p == itr->stack) { \
+ itr->p = NULL; \
+ return 0; \
+ } \
--itr->p; \
- if (itr->p < itr->stack) return 0; \
if (itr->p->x && itr->p->i < itr->p->x->n) return 1; \
} \
} \
static inline int kb_itr_prev_##name(kbtree_##name##_t *b, kbitr_##name##_t *itr) \
{ \
- if (itr->p < itr->stack) return 0; \
+ if (itr->p == NULL) return 0; \
for (;;) { \
while (itr->p->x && itr->p->i >= 0) { \
itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[itr->p->i] : 0; \
itr->p[1].i = itr->p[1].x ? itr->p[1].x->n : -1; \
++itr->p; \
} \
+ if (itr->p == itr->stack) { \
+ itr->p = NULL; \
+ return 0; \
+ } \
--itr->p; \
- if (itr->p < itr->stack) return 0; \
--itr->p->i; \
if (itr->p->x && itr->p->i >= 0) return 1; \
} \
@@ -374,6 +380,7 @@
itr->p[1].x = itr->p->x->is_internal? __KB_PTR(b, itr->p->x)[i + 1] : 0; \
++itr->p; \
} \
+ itr->p->i = 0; \
return 0; \
} \
static inline int kb_itr_get_##name(kbtree_##name##_t *b, key_t k, kbitr_##name##_t *itr) \