summaryrefslogtreecommitdiff
path: root/sql/keycaches.cc
diff options
context:
space:
mode:
authorEugene Kosov <claprix@yandex.ru>2019-10-09 03:09:48 +0300
committerEugene Kosov <claprix@yandex.ru>2019-10-14 19:16:50 +0300
commit4d14785546022ea8dc4e249e0b57b55328a12876 (patch)
treee097fdf5d3f2d3eb425829591a3e2b881bc60c0e /sql/keycaches.cc
parentf989c0ce66aa50ac904c75ccbdb850c0daa0419f (diff)
downloadmariadb-git-4d14785546022ea8dc4e249e0b57b55328a12876.tar.gz
MDEV-20778 UBSAN: call to function free_rpl_filter() through pointer to incorrect function type
Proper C-style type erasure is done via void*, not via char* or something else. free_key_cache() free_rpl_filter(): types were fixed to avoid function pointer type cast which is still undefined behavior. Note, that casting from void* to any other pointer type is safe and correct.
Diffstat (limited to 'sql/keycaches.cc')
-rw-r--r--sql/keycaches.cc13
1 files changed, 6 insertions, 7 deletions
diff --git a/sql/keycaches.cc b/sql/keycaches.cc
index bc0f43a4d69..43ec85d707c 100644
--- a/sql/keycaches.cc
+++ b/sql/keycaches.cc
@@ -84,7 +84,7 @@ bool NAMED_ILIST::delete_element(const char *name, uint length, void (*free_elem
DBUG_RETURN(1);
}
-void NAMED_ILIST::delete_elements(void (*free_element)(const char *name, uchar*))
+void NAMED_ILIST::delete_elements(void (*free_element)(const char *name, void*))
{
NAMED_ILINK *element;
DBUG_ENTER("NAMED_ILIST::delete_elements");
@@ -156,9 +156,9 @@ KEY_CACHE *get_or_create_key_cache(const char *name, uint length)
}
-void free_key_cache(const char *name, KEY_CACHE *key_cache)
+void free_key_cache(const char *name, void *key_cache)
{
- end_key_cache(key_cache, 1); // Can never fail
+ end_key_cache(static_cast<KEY_CACHE *>(key_cache), 1); // Can never fail
my_free(key_cache);
}
@@ -220,13 +220,12 @@ Rpl_filter *get_or_create_rpl_filter(const char *name, uint length)
return filter;
}
-void free_rpl_filter(const char *name, Rpl_filter *filter)
+void free_rpl_filter(const char *name, void *filter)
{
- delete filter;
- filter= 0;
+ delete static_cast<Rpl_filter*>(filter);
}
void free_all_rpl_filters()
{
- rpl_filters.delete_elements((void (*)(const char*, uchar*)) free_rpl_filter);
+ rpl_filters.delete_elements(free_rpl_filter);
}