Fix issue detected by address sanitizer

(Read beyond and below the table allocation).
This commit is contained in:
Patrick Pelissier committed 2017-09-27 22:57:08 +02:00
1 parent f08fa110ea
commit 8a1f24ca54
1 file changed
+7 -7
+7 -7
View File
@@ -1147,14 +1147,14 @@ typedef enum {
assert (it != NULL); \ assert (it != NULL); \
DICTI_OA_CONTRACT (it->dict); \ DICTI_OA_CONTRACT (it->dict); \
size_t i = it->index + 1; \ size_t i = it->index + 1; \
while ((oor_equal_p (it->dict->data[i].key, DICTI_OA_EMPTY) \ while (i <= it->dict->mask && \
|| oor_equal_p (it->dict->data[i].key, DICTI_OA_DELETED)) \ (oor_equal_p (it->dict->data[i].key, DICTI_OA_EMPTY) \
&& i <= it->dict->mask) { \ || oor_equal_p (it->dict->data[i].key, DICTI_OA_DELETED))) { \
i++; \ i++; \
} \ } \
it->index = i; \ it->index = i; \
} \ } \
\ \
static inline void \ static inline void \
M_C(name, _previous)(dict_it_t it) \ M_C(name, _previous)(dict_it_t it) \
{ \ { \
@@ -1162,9 +1162,9 @@ typedef enum {
DICTI_OA_CONTRACT (it->dict); \ DICTI_OA_CONTRACT (it->dict); \
/* if index was 0, the operation will overflow, and stops the loop */ \ /* if index was 0, the operation will overflow, and stops the loop */ \
size_t i = it->index - 1; \ size_t i = it->index - 1; \
while ((oor_equal_p (it->dict->data[i].key, DICTI_OA_EMPTY) \ while (i <= it->dict->mask && \
|| oor_equal_p (it->dict->data[i].key, DICTI_OA_DELETED)) \ (oor_equal_p (it->dict->data[i].key, DICTI_OA_EMPTY) \
&& i <= it->dict->mask) { \ || oor_equal_p (it->dict->data[i].key, DICTI_OA_DELETED))) { \
i--; \ i--; \
} \ } \
it->index = i; \ it->index = i; \