From: Marc Olivier Chouinard Date: Fri, 16 Dec 2011 02:08:52 +0000 (-0500) Subject: FS-3237 --resolve X-Git-Tag: v1.2-rc1~27^2~33 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3453f14f9bcd6f6ee517a9d8db32c279f8f9cd16;p=thirdparty%2Ffreeswitch.git 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. --- 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))) {