Skip to content
Permalink
Browse files

Speculative fix for MySQL crashes (#1135)

https://crash.limetech.org/stats/dbi.mysql.ext.%25/my_real_read
https://crash.limetech.org/stats/dbi.mysql.ext.%25/net_real_write

Both of these are caused by the VIO ptr ending up as null in the middle of reading/writing to a connection - I can't find any indication of a fix for this made to MySQL, so don't think it is a bug fix we're missing, but there are some musings around the internet that it could be caused by improper thread-safety initialisation.

`my_init` (what we had here) is called internally by `mysql_library_init` but I think would have still led to an automatic `mysql_library_init` call the first time `mysql_init` was called (which we can do on a thread in case of threaded connections), which is exactly the thread-safety issue called out by the MySQL docs, so hopefully doing things properly here will help.
  • Loading branch information
asherkin committed Dec 15, 2019
1 parent def6d0f commit 9cd4f9c210fc94e07c9025fbbd459ed4298cc701
Showing with 7 additions and 5 deletions.
  1. +7 −5 extensions/mysql/extension.cpp
@@ -46,18 +46,21 @@ SMEXT_LINK(&g_MySqlDBI);

bool DBI_MySQL::SDK_OnLoad(char *error, size_t maxlength, bool late)
{
if (mysql_library_init(0, NULL, NULL) != 0) {
smutils->Format(error, maxlength, "Could not initialize MySQL client library");
return false;
}

dbi->AddDriver(&g_MyDriver);

my_init();

return true;
}

void DBI_MySQL::SDK_OnUnload()
{
dbi->RemoveDriver(&g_MyDriver);
//:TODO: is this needed?
//mysql_library_end();

mysql_library_end();
}

const char *DBI_MySQL::GetExtensionVerString()
@@ -69,4 +72,3 @@ const char *DBI_MySQL::GetExtensionDateString()
{
return SOURCEMOD_BUILD_TIME;
}

0 comments on commit 9cd4f9c

Please sign in to comment.
You can’t perform that action at this time.