View Issue Details

IDProjectCategoryView StatusLast Update
0001604Far ManagerPlugins APIpublic2012-01-29 12:30
ReporterMaximus Assigned Tozg  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Platformx86OSWindowsOS Version7
Product Version2.0 
Fixed in Version3.0 
Summary0001604: Падение в PluginSynchro::Process если плагин уже выгружен
DescriptionПроисходит следующее
1. пользователь вводит в ком.строке "unload:<плагин>"
2. в это же время плагин вызывает ACTL_SYNCHRO
3. после этого происходит выгрузка плагина, вызывается ExitFarW
4. запускается цикл PluginSynchro::Process, в котором используется дескриптор уже выгруженного плагина

хорошо бы перед вызовом pPlugin->ProcessSynchroEvent проверять валидность pPlugin... например, как в патче
TagsNo tags attached.
Build1842

Activities

Maximus

2010-11-26 23:40

reporter  

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; }
101126.diff (1,568 bytes)   

Maximus

2011-12-31 10:49

reporter   bugnote:0008298

Патч был выложен более года назад.
Реакция - нулевая, почему?

vskirdin

2011-12-31 14:20

administrator   bugnote:0008300

Видимо в общей массе потерялся :-)

alexy

2011-12-31 14:53

administrator   bugnote:0008301

Ну это какой то костыль, надо как то лучше сделать мне кажеться.

zg

2012-01-29 12:03

developer   bugnote:0008501

вообще-то баг исправлен в
zg 09.02.2011 03:42:44 +0200 - build 1842

Issue History

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