michaellukashov / Far-NetBox

SFTP/SCP/FTP/FTPS/WebDAV/S3 client for Far Manager 3 (http://farmanager.com/)
https://forum.farmanager.com/viewtopic.php?t=6317
GNU General Public License v2.0
158 stars 52 forks source link

Падение плагина в OpenW при операциях синхронизации с FTP сервером #102

Closed VictorVG closed 10 years ago

VictorVG commented 10 years ago

Что имеем? Win7 SP1 x86, Far3 x86 двух различных версий - старую бету ь2798 с NetBox 2.1.13 и более новую ь3812 с NetBox 2.1.34 собранным из последних исходников 837b0ca от 18.02.2014, удалённый UNIX FTP Type: L8, полные привилегии администратора на локальной системе.

Проводим эксперимент: соединяемся с FTP, вызываем панель команд NetBox, включаем режим Synchronize browsing, Synchronize, прошёл процесс подсчёта объёмов данных, происходит открытие файлов для сравнения и в этот момент возникает ошибка в OpenW() приводящая к AV с кодом 0хС0000005 (нарушение защиты памяти), и если на ь2798 мне удалось отправить задачу в отладчик и увидеть там по логу что происходит эффект закольцовки ошибки (я это понял так):

Необработанное исключение в "0x0f1887fc" в "Far.exe": 0xC0000005: Access violation. Первый этап обработки исключения в "0x0f1887fc" в "Far.exe": 0xC0000005: Access violation. Необработанное исключение в "0x0f1887fc" в "Far.exe": 0xC0000005: Access violation. Первый этап обработки исключения в "0x0f1887fc" в "Far.exe": 0xC0000005: Access violation. Необработанное исключение в "0x0f1887fc" в "Far.exe": 0xC0000005: Access violation.

то в ь3811, ь3812, ь3813 попытка отправить задачу в отладчик у меня приводит к аварийному снятию задачи ОС.

В опыте я работал с FTP серверами ftp://ftp5.gwdg.de/pub/tdf/libreoffice/ и ftp://ftp.mozilla.org/

b2798 b3812

я пока не берусь с абсолютной уверенность утверждать что мы имеем дело с ошибкой в коде или алгоритме синхронизации, и вероятно что я выполняю не применимую операцию, но сам эффект как мне думается стоит исследовать чтобы выяснить его причины и их влияние на работу других функций плагина, а если выполняется недопустимая операция, то заблокировать возможность её вызова.

VictorVG commented 10 years ago

Собрал commit 49f78cb88b4e4be5621b0d30a8b5cf724d702936. Опции сборки (VS 2010 SP3):

cl

/I"." /I"....\libs\atlmfc\include" /I"..\core" /I"..\base" /I"..\resource" /I"..\windows" /I"....\libs\Putty" /I"....\libs\Putty\windows" /I"....\libs\Putty\charset" /I"..\PluginSDK\Far3" /I"....\libs" /I"....\libs\openssl\x64\inc32" /I"..\filezilla" /I"..\filezilla\misc" /I"....\libs\tinyxml2" /I"....\libs\neon\src" /I"....\libs\expat\lib" /I"....\libs\apr\include" /I"....\libs\apr\include\arch" /I"....\libs\apr\include\arch\win32" /I"....\libs\apr\include\arch\unix" /I"....\libs\dlmalloc" /I"....\libs\rdestl" /Zi /nologo /W4 /WX- /MP /Ox /Ob1 /Os /Oy /GT /GL /D "_SCL_SECURE_NO_WARNINGS" /D "WIN32" /D "WIN64" /D "NDEBUG" /D "_WINDOWS" /D "_WINDLL" /D "_USRDLL" /D "MPEXT" /D "NO_STRICT" /D "NE_LFS" /D "NE_HAVE_SSL" /D "HAVE_OPENSSL" /D "HAVE_EXPAT" /D "HAVE_EXPAT_H" /D "NE_HAVE_DAV" /D "NE_HAVE_ZLIB" /D "APR_DECLARE_STATIC" /D "XML_STATIC" /D "USE_DLMALLOC" /D "USE_DL_PREFIX" /D "_ATL_NO_COMMODULE" /D "_ATL_NO_PERF_SUPPORT" /D "_ATL_NO_DATETIMERESOURCES" /D "_UNICODE" /D "UNICODE" /GF /Gm- /EHsc /MT /GS- /Gy- /fp:precise /Zc:wchar_t /Zc:forScope /GR- /Fp"....\build\vc10\NetBox\Release\x64\NetBox.pch" /Fa"....\build\vc10\NetBox\Release\x64\" /Fo"....\build\vc10\NetBox\Release\x64\" /Fd"....\build\vc10\NetBox\Release\x64\vc100.pdb" /Gd /errorReport:queue

ld:

/OUT:"....\Far3_x64\Plugins\NetBox\NetBox.dll" /INCREMENTAL:NO /NOLOGO /LIBPATH:"....\build\vc10\NetBox\Release\x64\mfc" /LIBPATH:"....\libs\openssl\x64" /LIBPATH:"....\build\vc10\NetBox\Release\x64\libputty" /LIBPATH:"....\build\vc10\NetBox\Release\x64\libtinyxml2" /LIBPATH:"....\build\vc10\NetBox\Release\x64\libneon" /LIBPATH:"....\build\vc10\NetBox\Release\x64\libapr" /LIBPATH:"....\build\vc10\NetBox\Release\x64\libexpat" /LIBPATH:"....\build\vc10\NetBox\Release\x64\dlmalloc" /LIBPATH:"....\build\vc10\NetBox\Release\x64\rdestl" /DLL "mfc.lib" "shell32.lib" "shlwapi.lib" "gdi32.lib" "libcmt.lib" "libcpmt.lib" "libtinyxml2.lib" "libeay32.lib" "ssleay32.lib" "libputty.lib" "libexpat.lib" "libneon.lib" "libapr.lib" "Ws2_32.lib" "kernel32.lib" "user32.lib" "comdlg32.lib" "advapi32.lib" "Version.lib" "winhttp.lib" "winspool.lib" "Crypt32.lib" "dlmalloc.lib" "rdestl.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" "J:\Dev\Far-NetBox\build\vc10\NetBox\Release\x64\dlmalloc\dlmalloc.lib" "J:\Dev\Far-NetBox\build\vc10\NetBox\Release\x64\libtinyxml2\libtinyxml2.lib" "J:\Dev\Far-NetBox\build\vc10\NetBox\Release\x64\zlib\zlib.lib" "J:\Dev\Far-NetBox\build\vc10\NetBox\Release\x64\libputty\libputty.lib" "J:\Dev\Far-NetBox\build\vc10\NetBox\Release\x64\libexpat\libexpat.lib" "J:\Dev\Far-NetBox\build\vc10\NetBox\Release\x64\libneon\libneon.lib" "J:\Dev\Far-NetBox\build\vc10\NetBox\Release\x64\libapr\libapr.lib" /NODEFAULTLIB:"uafxcw.lib" /NODEFAULTLIB:"mfc100u.lib" /NODEFAULTLIB:"Atl.lib" /NODEFAULTLIB:"msvcrt.lib" /NODEFAULTLIB:"msvcurt.lib" /NODEFAULTLIB:"msvcprt.lib" /NODEFAULTLIB:"libc.lib" /DEF:"NetBox.def" /DELAYLOAD:"gdi32.dll" /DELAYLOAD:"winhttp.dll" /DELAYLOAD:"shell32.dll" /DELAYLOAD:"shlwapi.dll" /DELAYLOAD:"crypt32.dll" /DELAYLOAD:"version.dll" /DELAYLOAD:"ws2_32.dll" /DELAYLOAD:"oleaut32.dll" /MANIFEST:NO /ManifestFile:"....\build\vc10\NetBox\Release\x64\NetBox.dll.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /PDB:"J:\Dev\Far-NetBox\Far3_x64\Plugins\NetBox\NetBox.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF /PGD:"J:\Dev\Far-NetBox\Far3_x64\Plugins\NetBox\NetBox.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X64 /ERRORREPORT:QUEUE

собрал, на тест-наборе получил AV синхронизируясь с ftp://mozilla.org/:

b3814_new

Для проверки я пересобрал плагин с дефолтными настройками проекта из гита - и этот упал:

b3814_test2

ладно, Process Hacker умеет треды смотреть им и посмотрим в стеке тредов тот, где возник сбой:

TID 3276:

0, ntkrnlpa.exe!KiDeliverApc+0x111 1, ntkrnlpa.exe!KeRemoveQueueEx+0x990 2, ntkrnlpa.exe!KeDelayExecutionThread+0x5cc 3, ntkrnlpa.exe!KeWaitForSingleObject+0x393 4, win32k.sys!EngUnlockSurface+0x15db 5, win32k.sys!EngUnlockSurface+0x13e8 6, win32k.sys!EngLockSurface+0x620 7, win32k.sys!EngUnlockSurface+0x19a7 8, ntkrnlpa.exe!ZwYieldExecution+0xb86 9, ntdll.dll!KiFastSystemCallRet 10, NetBox.dll!OpenW+0x56477 11, NetBox.dll!OpenW+0x56db9 12, ntdll.dll!RtlInitializeExceptionChain+0xef 13, ntdll.dll!RtlInitializeExceptionChain+0xc2

TID 6960:

0, ntkrnlpa.exe!KiDeliverApc+0x111 1, ntkrnlpa.exe!KeRemoveQueueEx+0x990 2, ntkrnlpa.exe!KeDelayExecutionThread+0x5cc 3, ntkrnlpa.exe!KeWaitForSingleObject+0x393 4, ntkrnlpa.exe!NtWaitForSingleObject+0xc6 5, ntkrnlpa.exe!ZwYieldExecution+0xb86 6, ntdll.dll!KiFastSystemCallRet 7, kernel32.dll!WaitForSingleObjectEx+0x43 8, kernel32.dll!WaitForSingleObject+0x12 9, NetBox.dll+0x26a1 10, NetBox.dll!GetGlobalInfoW+0x1c36 11, ntdll.dll!RtlInitializeExceptionChain+0xef 12, ntdll.dll!RtlInitializeExceptionChain+0xc2

весь стек тредов в момент AV:

1600, 0,14, 7 381 959, Far.exe+0x1a6ecf, Normal 2652, 0,03, 1 684 337, FarHints.dll+0x2210, Normal 5800, 0,01, 626 493, crtdll.dll!beginthread+0x64, Normal 5472, , 188 730, PanelTabs.dll+0x1f7c, Normal 3276, , 73 198, NetBox.dll!OpenW+0x56db0, Below Normal 6960, , 30 618, NetBox.dll!GetGlobalInfoW+0x1c2d, Below Normal 3388, , 17 685, FarHints.dll+0x2210, Normal 7124, , , ntdll.dll!RtlRegisterThreadWithCsrss+0x197, Normal 7076, , , ntdll.dll!RtlRegisterThreadWithCsrss+0x197, Normal 6776, , , GdiPlus.dll!GdipCreateSolidFill+0x7eb, Normal 6608, , , Far.exe+0x1a2cb1, Normal 6032, , , ws2_32.dll!GetAddrInfoExA+0xa5d, Normal 5668, , , ntdll.dll!RtlFreeThreadActivationContextStack+0x517, Normal 5300, , , Far.exe+0x1a2cb1, Normal 4408, , , mswsock.dll+0x62ee, Above Normal 3048, , , Far.exe+0x1a2cb1, Normal 1656, , , Far.exe+0x1a2cb1, Normal

отладчик студии в данном случае оказался бессилен подключится к сбойной процедуре - выдаёт только список цепочки AV...

VictorVG commented 10 years ago

Собрал, посмотрел - всё равно падет, причём и сегодняшняя ночнушка и моя сборка. Я пытался отправить в отладчик - у меня не цепляется, потому просто сделал дамп памяти задачи в момент сбоя http://rghost.ru/private/52606877/ab43c555a0cc3f331f568a2f7df76a1d (7-Zip v9.30 Alpha, LZMA, SOLID, MAXIMUM) и дополнительно снял стек тредов и отдельно сбойный (глубже залезть в стек вызовов даже Process Hacker v2.34 (r5612) не смог :() . Вот что он нам сообщил:

Threads list:

2228, , 36 072, NetBox.dll!OpenW+0x37e5c, Below Normal <- в этом треде и происходит сбой 4308, , 22 936, FarHints.dll+0x2210, Normal 5148, , , ntdll.dll!RtlRegisterThreadWithCsrss+0x197, Normal 5244, 0,01, 729 851, crtdll.dll!beginthread+0x64, Normal 5268, , , ntdll.dll!RtlRegisterThreadWithCsrss+0x197, Normal 5936, 0,14, 7 349 285, Far.exe+0x1a6eef, Normal 6028, , , Far.exe+0x1a2cd1, Normal 6176, , 66 231, NetBox.dll!OpenW+0x54079, Below Normal 6836, 0,03, 1 611 916, FarHints.dll+0x2210, Normal 6840, , , mswsock.dll+0x62ee, Above Normal 7424, , , ntdll.dll!RtlFreeThreadActivationContextStack+0x517, Normal 7452, , , Far.exe+0x1a2cd1, Normal 7476, , , GdiPlus.dll!GdipCreateSolidFill+0x7eb, Normal 7796, , 128 857, PanelTabs.dll+0x1f7c, Normal 7804, , , ws2_32.dll!GetAddrInfoExA+0xa5d, Normal 7840, , , Far.exe+0x1a2cd1, Normal 8040, , , Far.exe+0x1a2cd1, Normal

TID 2228:

0, ntkrnlpa.exe!KiDeliverApc+0x111 1, ntkrnlpa.exe!KeRemoveQueueEx+0x990 2, ntkrnlpa.exe!KeDelayExecutionThread+0x5cc 3, ntkrnlpa.exe!KeWaitForSingleObject+0x393 4, ntkrnlpa.exe!NtWaitForSingleObject+0xc6 5, ntkrnlpa.exe!ZwYieldExecution+0xb86 6, ntdll.dll!KiFastSystemCallRet 7, kernel32.dll!WaitForSingleObjectEx+0x43 8, kernel32.dll!WaitForSingleObject+0x12 9, NetBox.dll+0x2145e 10, NetBox.dll!OpenW+0x37e65 11, ntdll.dll!RtlInitializeExceptionChain+0xef 12, ntdll.dll!RtlInitializeExceptionChain+0xc2

исследуем хендлы в 10, NetBox.dll!OpenW+0x37e65

Thread is waiting (alertable) for: Handle 0x700 (Event): (unnamed object)

Вот скриншоты событий - первый это сборка их ночнушки Far30b3817.x86.20140223.7z:

netbox

второй - этот уже я собирал и дам снят на наборе где используется собранная мной DLL:

netbox-2014-02-23_06-35

Я пытался расшифровать дамп, но доступная мне копия студии только сводку по нему вывела сообщив что код исключения в дампе не обнаружила...

VictorVG commented 10 years ago

Миша! ОГРОМНОЕ СПАСИБО! Собрал, запустил синхронизацию - без ошибок. Так что мы можем радоваться дважды - и ошибка ушла и ребята нас в Сочи порадовали. Они боги сегодня, особенно лыжники в 50 км марафоне - выиграть все три медали! Молодцы!