diff options
author | Eugene Kosov <claprix@yandex.ru> | 2019-10-09 03:09:48 +0300 |
---|---|---|
committer | Eugene Kosov <claprix@yandex.ru> | 2019-10-14 19:16:50 +0300 |
commit | 4d14785546022ea8dc4e249e0b57b55328a12876 (patch) | |
tree | e097fdf5d3f2d3eb425829591a3e2b881bc60c0e /sql/keycaches.cc | |
parent | f989c0ce66aa50ac904c75ccbdb850c0daa0419f (diff) | |
download | mariadb-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.cc | 13 |
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); } |