From 3453f14f9bcd6f6ee517a9d8db32c279f8f9cd16 Mon Sep 17 00:00:00 2001 From: Marc Olivier Chouinard Date: Thu, 15 Dec 2011 21:08:52 -0500 Subject: [PATCH] FS-3237 --resolve I've fix some memory leak in your patch. Be careful to free the value from the find output of a hash after you used it. --- src/mod/applications/mod_hash/mod_hash.c | 58 +++++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/src/mod/applications/mod_hash/mod_hash.c b/src/mod/applications/mod_hash/mod_hash.c index 25b3c8abfc..ced478bb1c 100644 --- a/src/mod/applications/mod_hash/mod_hash.c +++ b/src/mod/applications/mod_hash/mod_hash.c @@ -407,7 +407,7 @@ SWITCH_LIMIT_STATUS(limit_status_hash) /* CORE HASH STUFF */ -#define HASH_USAGE "[insert|delete]///" +#define HASH_USAGE "[insert|insert_ifempty|delete|delete_ifmatch]///" #define HASH_DESC "save data" SWITCH_STANDARD_APP(hash_function) @@ -443,11 +443,33 @@ SWITCH_STANDARD_APP(hash_function) value = strdup(argv[3]); switch_assert(value); switch_core_hash_insert(globals.db_hash, hash_key, value); + } else if (!strcasecmp(argv[0], "insert_ifempty")) { + if (argc < 4) { + goto usage; + } + if (!(value = switch_core_hash_find(globals.db_hash, hash_key))) { + value = strdup(argv[3]); + switch_assert(value); + switch_core_hash_insert(globals.db_hash, hash_key, value); + } else { + switch_safe_free(value); + } + } else if (!strcasecmp(argv[0], "delete")) { if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { switch_safe_free(value); switch_core_hash_delete(globals.db_hash, hash_key); } + } else if (!strcasecmp(argv[0], "delete_ifmatch")) { + if (argc < 4) { + goto usage; + } + if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { + if(!strcmp(argv[3], value)) { + switch_core_hash_delete(globals.db_hash, hash_key); + } + switch_safe_free(value); + } } else { goto usage; } @@ -463,7 +485,7 @@ SWITCH_STANDARD_APP(hash_function) switch_safe_free(hash_key); } -#define HASH_API_USAGE "insert|select|delete/realm/key[/value]" +#define HASH_API_USAGE "insert|insert_ifempty|select|delete|delete_ifmatch/realm/key[/value]" SWITCH_STANDARD_API(hash_api_function) { int argc = 0; @@ -498,6 +520,21 @@ SWITCH_STANDARD_API(hash_api_function) switch_core_hash_insert(globals.db_hash, hash_key, value); stream->write_function(stream, "+OK\n"); switch_thread_rwlock_unlock(globals.db_hash_rwlock); + } else if (!strcasecmp(argv[0], "insert_ifempty")) { + if (argc < 4) { + goto usage; + } + switch_thread_rwlock_wrlock(globals.db_hash_rwlock); + if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { + stream->write_function(stream, "-ERR key already exists\n"); + switch_safe_free(value); + } else { + value = strdup(argv[3]); + switch_assert(value); + switch_core_hash_insert(globals.db_hash, hash_key, value); + stream->write_function(stream, "+OK\n"); + } + switch_thread_rwlock_unlock(globals.db_hash_rwlock); } else if (!strcasecmp(argv[0], "delete")) { switch_thread_rwlock_wrlock(globals.db_hash_rwlock); if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { @@ -508,6 +545,23 @@ SWITCH_STANDARD_API(hash_api_function) stream->write_function(stream, "-ERR Not found\n"); } switch_thread_rwlock_unlock(globals.db_hash_rwlock); + } else if (!strcasecmp(argv[0], "delete_ifmatch")) { + if (argc < 4) { + goto usage; + } + switch_thread_rwlock_wrlock(globals.db_hash_rwlock); + if ((value = switch_core_hash_find(globals.db_hash, hash_key))) { + if(!strcmp(argv[3],value)) { + switch_core_hash_delete(globals.db_hash, hash_key); + stream->write_function(stream, "+OK\n"); + } else { + stream->write_function(stream, "-ERR Doesn't match\n"); + } + switch_safe_free(value); + } else { + stream->write_function(stream, "-ERR Not found\n"); + } + switch_thread_rwlock_unlock(globals.db_hash_rwlock); } else if (!strcasecmp(argv[0], "select")) { switch_thread_rwlock_rdlock(globals.db_hash_rwlock); if ((value = switch_core_hash_find(globals.db_hash, hash_key))) {