Skip to content

Commit cf1a892

Browse files
committed
ets hash table: handle bad alloc in comparison
Signed-off-by: Jakub Gonet <jakub.gonet@swmansion.com>
1 parent 6a68aec commit cf1a892

File tree

2 files changed

+10
-5
lines changed

2 files changed

+10
-5
lines changed

src/libAtomVM/ets_hashtable.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ struct HNode *ets_hashtable_new_node(term entry, int keypos)
100100
}
101101

102102
term new_entry = memory_copy_term_tree(&new_node->heap, entry);
103-
TERM_DEBUG_ASSERT(term_is_tuple(new_entry));
104-
TERM_DEBUG_ASSERT(term_get_tuple_arity(new_entry) >= keypos);
103+
assert(term_is_tuple(new_entry));
104+
assert(term_get_tuple_arity(new_entry) >= keypos);
105105
term key = term_get_tuple_element(new_entry, keypos);
106106

107107
new_node->next = NULL;
@@ -130,7 +130,12 @@ EtsHashtableErrorCode ets_hashtable_insert(struct EtsHashTable *hash_table, stru
130130
struct HNode *node = hash_table->buckets[index];
131131
struct HNode *last_node = NULL;
132132
while (node) {
133-
if (term_compare(key, node->key, TermCompareExact, global) == TermEquals) {
133+
TermCompareResult cmp = term_compare(key, node->key, TermCompareExact, global);
134+
if (UNLIKELY(cmp == TermCompareMemoryAllocFail)) {
135+
return EtsHashtableError;
136+
}
137+
138+
if (cmp == TermEquals) {
134139
if (opts & EtsHashtableAllowOverwrite) {
135140
if (IS_NULL_PTR(last_node)) {
136141
new_node->next = node->next;
@@ -142,7 +147,7 @@ EtsHashtableErrorCode ets_hashtable_insert(struct EtsHashTable *hash_table, stru
142147
ets_hashtable_free_node(node, global);
143148
return EtsHashtableOk;
144149
} else {
145-
return EtsHashtableFailure;
150+
return EtsHashtableKeyAlreadyExists;
146151
}
147152
}
148153
last_node = node;

src/libAtomVM/ets_hashtable.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ typedef enum EtsHashtableOptions
4545
typedef enum EtsHashtableErrorCode
4646
{
4747
EtsHashtableOk = 0,
48-
EtsHashtableFailure,
48+
EtsHashtableKeyAlreadyExists,
4949
EtsHashtableError
5050
} EtsHashtableErrorCode;
5151

0 commit comments

Comments
 (0)