init: workaround a double free in cookie allocation
This commit is contained in:
parent
f5a1105d48
commit
d5139c2cc4
15
init.cpp
15
init.cpp
@ -31,28 +31,25 @@ namespace {
|
|||||||
cruft::parse::enumeration::cookie log;
|
cruft::parse::enumeration::cookie log;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<state> s_state;
|
static std::unique_ptr<state> s_state;
|
||||||
std::atomic<int> s_count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Increase the reference count and initialising the requisite functionality if
|
// NOTE: We were using reference counting to cleanup s_state at cookie
|
||||||
// this is the first instance of the class.
|
// destruction time, but for some reason this results in a double-free under
|
||||||
|
// gcc-usan. It's easier to just allow it to live past the useful period and
|
||||||
|
// perform cleanup atexit.
|
||||||
static void up (void)
|
static void up (void)
|
||||||
{
|
{
|
||||||
if (int old = s_count++; !old)
|
if (!s_state)
|
||||||
s_state = std::make_unique<state> ();
|
s_state = std::make_unique<state> ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Decrease the reference count and release any resources if this was the last
|
|
||||||
// instance of the class.
|
|
||||||
static void down (void)
|
static void down (void)
|
||||||
{
|
{
|
||||||
if (int old = --s_count; !old)
|
|
||||||
s_state.reset ();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user