[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