[Scummvm-git-logs] scummvm master -> b38d1c3e6c27e2f56dea7b5e1a8d90e76c9a9951

dreammaster dreammaster at scummvm.org
Mon Jul 19 04:20:14 UTC 2021


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
b38d1c3e6c AGS: Fix crash when starting games with multiple plugins


Commit: b38d1c3e6c27e2f56dea7b5e1a8d90e76c9a9951
    https://github.com/scummvm/scummvm/commit/b38d1c3e6c27e2f56dea7b5e1a8d90e76c9a9951
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-07-18T21:19:29-07:00

Commit Message:
AGS: Fix crash when starting games with multiple plugins

Changed paths:
    engines/ags/globals.cpp
    engines/ags/plugins/ags_clipboard/ags_clipboard.cpp
    engines/ags/plugins/ags_plugin.cpp
    engines/ags/plugins/ags_plugin.h
    engines/ags/plugins/ags_tcp_ip/ags_tcp_ip.cpp


diff --git a/engines/ags/globals.cpp b/engines/ags/globals.cpp
index 1791f4547d..a8fac3c3b4 100644
--- a/engines/ags/globals.cpp
+++ b/engines/ags/globals.cpp
@@ -297,6 +297,7 @@ Globals::Globals() {
 	// plugins globals
 	_engineExports = new Plugins::Core::EngineExports();
 	_plugins = new Common::Array<EnginePlugin>();
+	_plugins->reserve(MAXPLUGINS);
 
 	// plugin_object_reader.cpp globals
 	_pluginReaders = new PluginObjectReader[MAX_PLUGIN_OBJECT_READERS];
diff --git a/engines/ags/plugins/ags_clipboard/ags_clipboard.cpp b/engines/ags/plugins/ags_clipboard/ags_clipboard.cpp
index ac01d6cbb1..51a7292a1f 100644
--- a/engines/ags/plugins/ags_clipboard/ags_clipboard.cpp
+++ b/engines/ags/plugins/ags_clipboard/ags_clipboard.cpp
@@ -32,7 +32,7 @@ const char *AGSClipboard::AGS_GetPluginName() {
 }
 
 void AGSClipboard::AGS_EngineStartup(IAGSEngine *engine) {
-	AGS_EngineStartup(engine);
+	PluginBase::AGS_EngineStartup(engine);
 
 	SCRIPT_METHOD(Clipboard::PasteText, AGSClipboard::Clipboard_PasteText);
 	SCRIPT_METHOD(Clipboard::CopyText^1, AGSClipboard::Clipboard_CopyText);
diff --git a/engines/ags/plugins/ags_plugin.cpp b/engines/ags/plugins/ags_plugin.cpp
index 4394f77933..c24ae9758e 100644
--- a/engines/ags/plugins/ags_plugin.cpp
+++ b/engines/ags/plugins/ags_plugin.cpp
@@ -82,7 +82,6 @@ using namespace AGS::Shared::Memory;
 using namespace AGS::Engine;
 
 const int PLUGIN_API_VERSION = 25;
-#define MAXPLUGINS 20
 
 // On save/restore, the Engine will provide the plugin with a handle. Because we only ever save to one file at a time,
 // we can reuse the same handle.
@@ -760,7 +759,9 @@ void pl_stop_plugins() {
 			}
 		}
 	}
+
 	_GP(plugins).clear();
+	_GP(plugins).reserve(MAXPLUGINS);
 }
 
 void pl_startup_plugins() {
@@ -768,8 +769,10 @@ void pl_startup_plugins() {
 		if (i == 0)
 			_GP(engineExports).AGS_EngineStartup(&_GP(plugins)[0].eiface);
 
-		if (_GP(plugins)[i].available)
-			_GP(plugins)[i]._plugin->AGS_EngineStartup(&_GP(plugins)[i].eiface);
+		if (_GP(plugins)[i].available) {
+			EnginePlugin &ep = _GP(plugins)[i];
+			ep._plugin->AGS_EngineStartup(&ep.eiface);
+		}
 	}
 }
 
@@ -806,6 +809,7 @@ void pl_run_plugin_init_gfx_hooks(const char *driverName, void *data) {
 
 Engine::GameInitError pl_register_plugins(const std::vector<Shared::PluginInfo> &infos) {
 	_GP(plugins).clear();
+	_GP(plugins).reserve(MAXPLUGINS);
 
 	for (size_t inf_index = 0; inf_index < infos.size(); ++inf_index) {
 		const Shared::PluginInfo &info = infos[inf_index];
diff --git a/engines/ags/plugins/ags_plugin.h b/engines/ags/plugins/ags_plugin.h
index 16e3d38608..887db41159 100644
--- a/engines/ags/plugins/ags_plugin.h
+++ b/engines/ags/plugins/ags_plugin.h
@@ -60,6 +60,8 @@ class BITMAP;
 typedef int HWND;
 #endif
 
+#define MAXPLUGINS 20
+
 #define AGSIFUNC(type) virtual type
 
 #define MASK_WALKABLE   1
@@ -559,26 +561,19 @@ public:
 };
 
 struct EnginePlugin {
-	char        filename[PLUGIN_FILENAME_MAX + 1];
+	char filename[PLUGIN_FILENAME_MAX + 1] = { 0 };
 	AGS::Engine::Library   library;
-	Plugins::PluginBase *_plugin;
-	bool       available;
-	char *savedata;
-	int         savedatasize;
-	int         wantHook;
-	int         invalidatedRegion;
+	Plugins::PluginBase *_plugin = nullptr;
+	bool available = false;
+	char *savedata = nullptr;
+	int savedatasize = 0;
+	int wantHook = 0;
+	int invalidatedRegion = 0;
+	bool builtin = false;
 
 	IAGSEngine  eiface;
-	bool        builtin;
 
 	EnginePlugin() {
-		filename[0] = 0;
-		wantHook = 0;
-		invalidatedRegion = 0;
-		savedata = nullptr;
-		savedatasize = 0;
-		builtin = false;
-		available = false;
 		eiface.version = 0;
 		eiface.pluginId = 0;
 	}
diff --git a/engines/ags/plugins/ags_tcp_ip/ags_tcp_ip.cpp b/engines/ags/plugins/ags_tcp_ip/ags_tcp_ip.cpp
index 3240a8ae63..e3dc7e949d 100644
--- a/engines/ags/plugins/ags_tcp_ip/ags_tcp_ip.cpp
+++ b/engines/ags/plugins/ags_tcp_ip/ags_tcp_ip.cpp
@@ -31,6 +31,7 @@ const char *AGSTcpIp::AGS_GetPluginName() {
 }
 
 void AGSTcpIp::AGS_EngineStartup(IAGSEngine *engine) {
+	PluginBase::AGS_EngineStartup(engine);
 }
 
 } // namespace AGSTcpIp




More information about the Scummvm-git-logs mailing list