diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2019-05-18 14:33:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-18 14:33:14 +0200 |
commit | 8e22c4510eb9220f7ead6493fdcfdd7bf1f53d3b (patch) | |
tree | 4f247ff9bfffdc09520954fa0269c51bdb9f6850 | |
parent | 5625c7d8e16475b8732f0aa0238ffd6154446c09 (diff) | |
parent | b247c6fd225566bdae2f31ad85d3a822cf3f1254 (diff) | |
download | rneovim-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.h | 17 |
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) \ |