aboutsummaryrefslogtreecommitdiffstats
path: root/src/util/set.c
diff options
context:
space:
mode:
authorConnor Abbott <[email protected]>2015-11-14 20:20:42 -0500
committerConnor Abbott <[email protected]>2016-02-02 14:42:32 -0500
commit8fc2f652a29c7c307b9a076bbda4a5fce5e93361 (patch)
tree5177e87a0d329564a343bed7e8b630eb2fbf76e1 /src/util/set.c
parentbd97b62525e2d58870619b941d43c4545f922a2f (diff)
util/set: don't compare against deleted entries
When we delete entries in the hash set, we mark them "deleted" by setting their key to the deleted_key, which points to a dummy deleted_key_value. When searching for an entry, we normally skip over those, but set_add() had some code for searching for duplicate entries which forgot to skip over deleted entries. This led to a segfault inside the NIR vectorization pass, since its key comparison function interpreted the memory where deleted_key_value resides as a pointer and tried to dereference it. v2: - add better commit message (Timothy) - use entry_is_deleted (Timothy) Reviewed-by: Timothy Arceri <[email protected]> Signed-off-by: Connor Abbott <[email protected]>
Diffstat (limited to 'src/util/set.c')
-rw-r--r--src/util/set.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/util/set.c b/src/util/set.c
index f01f8699ac2..99abefd0632 100644
--- a/src/util/set.c
+++ b/src/util/set.c
@@ -282,7 +282,8 @@ set_add(struct set *ht, uint32_t hash, const void *key)
* If freeing of old keys is required to avoid memory leaks,
* perform a search before inserting.
*/
- if (entry->hash == hash &&
+ if (!entry_is_deleted(entry) &&
+ entry->hash == hash &&
ht->key_equals_function(key, entry->key)) {
entry->key = key;
return entry;