mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
MDEV-28268: Server crashes in Expression_cache_tracker::fetch_current_stats
Expression_cache_tmptable object uses an Expression_cache_tracker object to report the statistics. In the common scenario, Expression_cache_tmptable destructor sets tracker->cache=NULL. The tracker object survives after the expression cache is deleted and one may call cache_tracker->fetch_current_stats() for it with no harm. However a degenerate cache with no parameters does not set tracker->cache=NULL in Expression_cache_tmptable destructor which results in an attempt to use freed data in the cache_tracker->fetch_current_stats() call. Fixed by setting tracker->cache to NULL and wrapping the assignment into a function.
This commit is contained in:
@ -83,7 +83,11 @@ public:
|
||||
cache(c), hit(0), miss(0), state(UNINITED)
|
||||
{}
|
||||
|
||||
private:
|
||||
// This can be NULL if the cache is already deleted
|
||||
Expression_cache *cache;
|
||||
|
||||
public:
|
||||
ulong hit, miss;
|
||||
enum expr_cache_state state;
|
||||
|
||||
@ -91,6 +95,7 @@ public:
|
||||
void set(ulong h, ulong m, enum expr_cache_state s)
|
||||
{hit= h; miss= m; state= s;}
|
||||
|
||||
void detach_from_cache() { cache= NULL; }
|
||||
void fetch_current_stats()
|
||||
{
|
||||
if (cache)
|
||||
|
Reference in New Issue
Block a user