From b5de3eb58818e378354446954a31c185fb64de1c Mon Sep 17 00:00:00 2001 From: Asher Baker Date: Sun, 15 Dec 2019 15:01:15 +0000 Subject: [PATCH] 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. --- extensions/mysql/extension.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/extensions/mysql/extension.cpp b/extensions/mysql/extension.cpp index 272b50ef..329df4fb 100644 --- a/extensions/mysql/extension.cpp +++ b/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; } -