|| dl_hashtbl -> entries > ((word)1 << dl_hashtbl -> log_size)) {
GC_grow_table((struct hash_chain_entry ***)&dl_hashtbl -> head,
&dl_hashtbl -> log_size);
+ GC_ASSERT(dl_hashtbl->log_size >= 0);
GC_COND_LOG_PRINTF("Grew %s table to %u entries\n", tbl_log_name,
1 << (unsigned)dl_hashtbl -> log_size);
}
{
struct disappearing_link *curr_dl;
struct disappearing_link *prev_dl = NULL;
- size_t index = HASH2(link, dl_hashtbl->log_size);
+ size_t index;
+
+ if (dl_hashtbl->log_size == -1)
+ return NULL; /* prevent integer shift by a negative amount */
+ index = HASH2(link, dl_hashtbl->log_size);
for (curr_dl = dl_hashtbl -> head[index]; curr_dl;
curr_dl = dl_next(curr_dl)) {
if (curr_dl -> dl_hidden_link == GC_HIDE_POINTER(link)) {
word curr_hidden_link;
word new_hidden_link;
+ if (dl_hashtbl->log_size == -1)
+ return GC_NOT_FOUND; /* prevent integer shift by a negative amount */
+
/* Find current link. */
curr_index = HASH2(link, dl_hashtbl -> log_size);
curr_hidden_link = GC_HIDE_POINTER(link);
|| GC_fo_entries > ((word)1 << log_fo_table_size)) {
GC_grow_table((struct hash_chain_entry ***)&GC_fnlz_roots.fo_head,
&log_fo_table_size);
+ GC_ASSERT(log_fo_table_size >= 0);
GC_COND_LOG_PRINTF("Grew fo table to %u entries\n",
1 << (unsigned)log_fo_table_size);
}
other finalizable objects */
if (need_unreachable_finalization) {
curr_fo = GC_fnlz_roots.finalize_now;
+ GC_ASSERT(NULL == curr_fo || log_fo_table_size >= 0);
prev_fo = NULL;
while (curr_fo != NULL) {
next_fo = fo_next(curr_fo);