View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001604 | Far Manager | Plugins API | public | 2010-11-26 23:40 | 2012-01-29 12:30 |
| Reporter | Maximus | Assigned To | zg | ||
| Priority | normal | Severity | minor | Reproducibility | always |
| Status | closed | Resolution | fixed | ||
| Platform | x86 | OS | Windows | OS Version | 7 |
| Product Version | 2.0 | ||||
| Fixed in Version | 3.0 | ||||
| Summary | 0001604: Падение в PluginSynchro::Process если плагин уже выгружен | ||||
| Description | Происходит следующее 1. пользователь вводит в ком.строке "unload:<плагин>" 2. в это же время плагин вызывает ACTL_SYNCHRO 3. после этого происходит выгрузка плагина, вызывается ExitFarW 4. запускается цикл PluginSynchro::Process, в котором используется дескриптор уже выгруженного плагина хорошо бы перед вызовом pPlugin->ProcessSynchroEvent проверять валидность pPlugin... например, как в патче | ||||
| Tags | No tags attached. | ||||
| Build | 1842 | ||||
|
|
101126.diff (1,568 bytes)
Index: synchro.cpp
===================================================================
--- synchro.cpp (revision 5274)
+++ synchro.cpp (working copy)
@@ -35,6 +35,7 @@
#include "synchro.hpp"
#include "plclass.hpp"
#include "plugin.hpp"
+#include "ctrlobj.hpp"
#include "adminmode.hpp"
@@ -95,7 +96,8 @@
{
Plugin* pPlugin=(Plugin*)module;
- if (pPlugin)
+ // ���� �� ��������� ��������� pPlugin. �� ��� �� ������� (�������� ����� FarCmd -> unload:)
+ if (pPlugin && CtrlObject->Plugins.IsPluginValid(pPlugin))
{
pPlugin->ProcessSynchroEvent(SE_COMMONSYNCHRO,param);
res=true;
Index: plugins.cpp
===================================================================
--- plugins.cpp (revision 5274)
+++ plugins.cpp (working copy)
@@ -484,6 +484,20 @@
return nullptr;
}
+bool PluginManager::IsPluginValid(Plugin *pPlugin)
+{
+ Plugin *pTest;
+
+ for (int i = 0; i < PluginsCount; i++)
+ {
+ pTest = PluginsData[i];
+ if (pTest == pPlugin)
+ return true;
+ }
+
+ return false;
+}
+
void PluginManager::LoadPlugins()
{
TaskBar TB(false);
Index: plugins.hpp
===================================================================
--- plugins.hpp (revision 5274)
+++ plugins.hpp (working copy)
@@ -200,6 +200,7 @@
Plugin *GetPlugin(const wchar_t *lpwszModuleName);
Plugin *GetPlugin(int PluginNumber);
+ bool IsPluginValid(Plugin *pPlugin);
int GetPluginsCount() { return PluginsCount; }
int GetOemPluginsCount() { return OemPluginsCount; }
|
|
|
Патч был выложен более года назад. Реакция - нулевая, почему? |
|
|
Видимо в общей массе потерялся :-) |
|
|
Ну это какой то костыль, надо как то лучше сделать мне кажеться. |
|
|
вообще-то баг исправлен в zg 09.02.2011 03:42:44 +0200 - build 1842 |
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2010-11-26 23:40 | Maximus | New Issue | |
| 2010-11-26 23:40 | Maximus | File Added: 101126.diff | |
| 2011-12-31 10:49 | Maximus | Note Added: 0008298 | |
| 2011-12-31 14:20 | vskirdin | Note Added: 0008300 | |
| 2011-12-31 14:53 | alexy | Note Added: 0008301 | |
| 2011-12-31 14:53 | alexy | Assigned To | => zg |
| 2011-12-31 14:53 | alexy | Status | new => assigned |
| 2012-01-29 12:03 | zg | Note Added: 0008501 | |
| 2012-01-29 12:30 | alexy | Build | => 1842 |
| 2012-01-29 12:30 | alexy | Status | assigned => closed |
| 2012-01-29 12:30 | alexy | Resolution | open => fixed |
| 2012-01-29 12:30 | alexy | Fixed in Version | => 3.0 |