From f3650b05cf4e37066d0f142a4c14fcc650de8d8d Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Fri, 7 Oct 2011 14:29:51 -0700 Subject: [PATCH] hash_table: Make string_to_uint_map make a copy of the name MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The hash table needs a copy of the key that it can keep for comparisons during searches. Signed-off-by: Ian Romanick Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=41499 Cc: Stéphane Marchesin Tested-by: Luzipher Tested-by: Michał Lipski Reviewed-by: Kenneth Graunke --- src/mesa/program/hash_table.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/mesa/program/hash_table.h b/src/mesa/program/hash_table.h index bfe221b242f..941d28a4ce9 100644 --- a/src/mesa/program/hash_table.h +++ b/src/mesa/program/hash_table.h @@ -32,6 +32,7 @@ #define HASH_TABLE_H #include +#include #include #include #include @@ -100,6 +101,10 @@ extern void *hash_table_find(struct hash_table *ht, const void *key); * calls to \c hash_table_find and \c hash_table_remove will return or remove, * repsectively, the most recently added instance of \c key. * + * \warning + * The value passed by \c key is kept in the hash table and is used by later + * calls to \c hash_table_find. + * * \sa hash_table_replace */ extern void hash_table_insert(struct hash_table *ht, void *data, @@ -204,6 +209,7 @@ public: ~string_to_uint_map() { + hash_table_call_foreach(this->ht, delete_key, NULL); hash_table_dtor(this->ht); } @@ -243,10 +249,20 @@ public: * because UINT_MAX+1 = 0. */ assert(value != UINT_MAX); - hash_table_replace(ht, (void *) (intptr_t) (value + 1), key); + hash_table_replace(this->ht, + (void *) (intptr_t) (value + 1), + strdup(key)); } private: + static void delete_key(const void *key, void *data, void *closure) + { + (void) data; + (void) closure; + + free((char *)key); + } + struct hash_table *ht; }; -- 2.30.2