summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicențiu Ciorbaru <cvicentiu@gmail.com>2013-10-17 15:03:12 -0700
committerSergei Golubchik <sergii@pisem.net>2013-10-17 15:03:12 -0700
commitdeffce1acea76ceea76765b5907245f887f8de3e (patch)
tree139a9d5b32967cd8f0a9d9b928e998931a2e9f7b
parent89229fb71c5c0db7958915b9ed10a6d0f7f4b0a3 (diff)
downloadmariadb-git-deffce1acea76ceea76765b5907245f887f8de3e.tar.gz
Free some memory leaks
Still problems with hashtable acl_roles Need to create a copy of grant_roles, currently it uses the same buffer
-rw-r--r--include/my_sys.h1
-rw-r--r--sql/sql_acl.cc18
2 files changed, 15 insertions, 4 deletions
diff --git a/include/my_sys.h b/include/my_sys.h
index e1d07b457bb..0c8314a5519 100644
--- a/include/my_sys.h
+++ b/include/my_sys.h
@@ -794,6 +794,7 @@ extern my_bool allocate_dynamic(DYNAMIC_ARRAY *array, uint max_elements);
extern void get_dynamic(DYNAMIC_ARRAY *array,uchar * element,uint array_index);
extern void delete_dynamic(DYNAMIC_ARRAY *array);
extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
+extern void delete_dynamic_recursive(DYNAMIC_ARRAY *array, FREE_FUNC f);
extern void freeze_size(DYNAMIC_ARRAY *array);
extern int get_index_dynamic(DYNAMIC_ARRAY *array, uchar * element);
#define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element)
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 20b3bbd5a0d..4705e152f37 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -230,7 +230,6 @@ public:
if the instance of the class represents a user, or a user if the
instance of the class represents a role.
*/
- //TODO this array does not get freed automatically when acl_users is freed
DYNAMIC_ARRAY role_grants;
ACL_USER *copy(MEM_ROOT *root)
@@ -251,6 +250,7 @@ public:
dst->plugin.str= strmake_root(root, plugin.str, plugin.length);
dst->auth_string.str= safe_strdup_root(root, auth_string.str);
dst->host.hostname= safe_strdup_root(root, host.hostname);
+ dst->role_grants= this->role_grants;
return dst;
}
};
@@ -574,6 +574,7 @@ static int acl_compare(ACL_ACCESS *a,ACL_ACCESS *b);
static ulong get_sort(uint count,...);
static void init_check_host(void);
static void rebuild_check_host(void);
+static void free_acl_user(ACL_USER *acl_user);
static ACL_USER *find_acl_user(const char *host, const char *user,
my_bool exact);
static ACL_USER *find_acl_role(const char *user);
@@ -601,6 +602,13 @@ typedef struct st_role_grant
char *username;
char *hostname;
} ROLE_GRANT_PAIR;
+
+static
+void
+free_acl_user(ACL_USER *user)
+{
+ delete_dynamic(&(user->role_grants));
+}
/*
Convert scrambled password to binary form, according to scramble type,
Binary form is stored in user.salt.
@@ -1060,6 +1068,7 @@ static my_bool acl_load(THD *thd, TABLE_LIST *tables)
if (is_role) {
sql_print_information("Found role %s", user.user.str);
my_hash_insert(&acl_roles, (uchar*) user.copy(&mem));
+ continue;
}
else
{
@@ -1243,7 +1252,7 @@ void acl_free(bool end)
{
free_root(&mem,MYF(0));
delete_dynamic(&acl_hosts);
- delete_dynamic(&acl_users);
+ delete_dynamic_recursive(&acl_users, (FREE_FUNC)free_acl_user);
delete_dynamic(&acl_dbs);
delete_dynamic(&acl_wild_hosts);
delete_dynamic(&acl_proxy_users);
@@ -1363,7 +1372,7 @@ my_bool acl_reload(THD *thd)
{
free_root(&old_mem,MYF(0));
delete_dynamic(&old_acl_hosts);
- delete_dynamic(&old_acl_users);
+ delete_dynamic_recursive(&old_acl_users, (FREE_FUNC) free_acl_user);
delete_dynamic(&old_acl_proxy_users);
delete_dynamic(&old_acl_dbs);
my_hash_free(&old_acl_roles);
@@ -1907,7 +1916,8 @@ static void init_check_host(void)
acl_users.elements, 1, MYF(0));
(void) my_hash_init(&acl_check_hosts,system_charset_info,
acl_users.elements, 0, 0,
- (my_hash_get_key) check_get_key, 0, 0);
+ (my_hash_get_key) check_get_key,
+ (void (*)(void *))free_acl_user, 0);
if (!allow_all_hosts)
{
for (uint i=0 ; i < acl_users.elements ; i++)