]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
[Core] Fix potential leak of hash table keys. 368/head
authorAndrey Volk <andywolk@gmail.com>
Sat, 15 Feb 2020 20:07:13 +0000 (00:07 +0400)
committerAndrey Volk <andywolk@gmail.com>
Sat, 15 Feb 2020 20:07:13 +0000 (00:07 +0400)
src/switch_core_hash.c

index 1655aac7265fbf94b8b3b53048e0de4a7012b610..70102ce9572c21c3e47a693896296ba03ed855de 100644 (file)
@@ -57,20 +57,28 @@ SWITCH_DECLARE(switch_status_t) switch_core_hash_destroy(switch_hash_t **hash)
 
 SWITCH_DECLARE(switch_status_t) switch_core_hash_insert_auto_free(switch_hash_t *hash, const char *key, const void *data)
 {
-       int r = 0;
+       char *dkey = strdup(key);
+
+       if (switch_hashtable_insert_destructor(hash, dkey, (void *)data, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_FLAG_FREE_VALUE | HASHTABLE_DUP_CHECK, NULL)) {
+               return SWITCH_STATUS_SUCCESS;
+       }
 
-       r = switch_hashtable_insert_destructor(hash, strdup(key), (void *)data, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_FLAG_FREE_VALUE | HASHTABLE_DUP_CHECK, NULL);
+       switch_safe_free(dkey);
 
-       return r ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
+       return SWITCH_STATUS_FALSE;
 }
 
 SWITCH_DECLARE(switch_status_t) switch_core_hash_insert_destructor(switch_hash_t *hash, const char *key, const void *data, hashtable_destructor_t destructor)
 {
-       int r = 0;
+       char *dkey = strdup(key);
+
+       if (switch_hashtable_insert_destructor(hash, dkey, (void *)data, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_DUP_CHECK, destructor)) {
+               return SWITCH_STATUS_SUCCESS;
+       }
 
-       r = switch_hashtable_insert_destructor(hash, strdup(key), (void *)data, HASHTABLE_FLAG_FREE_KEY | HASHTABLE_DUP_CHECK, destructor);
+       switch_safe_free(dkey);
 
-       return r ? SWITCH_STATUS_SUCCESS : SWITCH_STATUS_FALSE;
+       return SWITCH_STATUS_FALSE;
 }
 
 SWITCH_DECLARE(switch_status_t) switch_core_hash_insert_locked(switch_hash_t *hash, const char *key, const void *data, switch_mutex_t *mutex)