From e555bcef7aa2579ad97bf1f8272b64f9c8c14e4c Mon Sep 17 00:00:00 2001
From: redpolline <11156324-redpolline@users.noreply.gitlab.com>
Date: Sat, 14 Dec 2024 19:48:59 -0500
Subject: [PATCH] Init callback objects first, fix mutex locking

Init callback related objects in Steam_Client before initing anything
else.

Fix missing global_mutex lock in Steam_Client::RegisterCallback() and
Steam_Client::UnregisterCallback().
---
 dll/steam_client.cpp | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/dll/steam_client.cpp b/dll/steam_client.cpp
index 101d089..37c2365 100644
--- a/dll/steam_client.cpp
+++ b/dll/steam_client.cpp
@@ -50,16 +50,16 @@ static void background_thread(Steam_Client *client)
 
 Steam_Client::Steam_Client()
 {
-    uint32 appid = create_localstorage_settings(&settings_client, &settings_server, &local_storage);
-
-    network = new Networking(settings_server->get_local_steam_id(), appid, settings_server->get_port(), &(settings_server->custom_broadcasts), settings_server->disable_networking);
-
     callback_results_client = new SteamCallResults();
     callback_results_server = new SteamCallResults();
     callbacks_client = new SteamCallBacks(callback_results_client);
     callbacks_server = new SteamCallBacks(callback_results_server);
     run_every_runcb = new RunEveryRunCB();
 
+    uint32 appid = create_localstorage_settings(&settings_client, &settings_server, &local_storage);
+
+    network = new Networking(settings_server->get_local_steam_id(), appid, settings_server->get_port(), &(settings_server->custom_broadcasts), settings_server->disable_networking);
+
     PRINT_DEBUG("steam client init: id: %llu server id: %llu appid: %u port: %u \n", settings_client->get_local_steam_id().ConvertToUint64(), settings_server->get_local_steam_id().ConvertToUint64(), appid, settings_server->get_port());
 
     if (appid) {
@@ -1433,9 +1433,22 @@ void Steam_Client::RegisterCallback( class CCallbackBase *pCallback, int iCallba
             PRINT_DEBUG("Unknown callback base %i\n", base_callback);
     };
 
+    std::lock_guard<std::recursive_mutex> lock(global_mutex);
     if (isGameServer) {
+        if (callback_results_server == nullptr) {
+            callback_results_server = new SteamCallResults();
+        }
+        if (callbacks_server == nullptr) {
+            callbacks_server = new SteamCallBacks(callback_results_server);
+        }
         callbacks_server->addCallBack(iCallback, pCallback);
     } else {
+        if (callback_results_client == nullptr) {
+            callback_results_client = new SteamCallResults();
+        }
+        if (callbacks_client == nullptr) {
+            callbacks_client = new SteamCallBacks(callback_results_client);
+        }
         callbacks_client->addCallBack(iCallback, pCallback);
     }
 }
@@ -1657,10 +1670,15 @@ void Steam_Client::UnregisterCallback( class CCallbackBase *pCallback)
             PRINT_DEBUG("Unknown callback base %i\n", base_callback);
     };
 
+    std::lock_guard<std::recursive_mutex> lock(global_mutex);
     if (isGameServer) {
-        callbacks_server->rmCallBack(iCallback, pCallback);
+        if (callbacks_server != nullptr) {
+            callbacks_server->rmCallBack(iCallback, pCallback);
+        }
     } else {
-        callbacks_client->rmCallBack(iCallback, pCallback);
+        if (callbacks_client != nullptr) {
+            callbacks_client->rmCallBack(iCallback, pCallback);
+        }
     }
 }
 
@@ -1670,7 +1688,6 @@ void Steam_Client::RegisterCallResult( class CCallbackBase *pCallback, SteamAPIC
     std::lock_guard<std::recursive_mutex> lock(global_mutex);
     callback_results_client->addCallBack(hAPICall, pCallback);
     callback_results_server->addCallBack(hAPICall, pCallback);
-    
 }
 
 void Steam_Client::UnregisterCallResult( class CCallbackBase *pCallback, SteamAPICall_t hAPICall)