trexinc / evil-programmers

Misc. Far plugins and tools by evil programmers
66 stars 26 forks source link

Far 3 x64 build 4839 : BCopy.dll AV/Trap on OpenPlugin #27

Closed pult closed 7 years ago

pult commented 8 years ago

http://bugs.farmanager.com/view.php?id=3350

Far 3 x64 build 4839 : BCopy.dll AV/Trap on OpenPlugin AV/Падение при попытке вызвать диалог копирования для плагина bcopy.dll для x64 (x86 - этой проблемы нет). Предыдущая сборка 4833 этой проблемы не имеет!

>DrKnS: Падает здесь: di.History = AnsiToUnicode(diA.History); Потому что diA.History - 0xcccccccc6194e26a, что как-то не очень похоже на валидный адрес. Однако, если мы отбросим старший дворд и посмотрим на 6194e26a как на char*, то увидим "BCopyCopy", что уже теплее. Поискав "BCopyCopy" в исходниках плагина, мы найдём его в инициализации того самого диалога копирования:

static const TCHAR *BCopyCopyHistoryName=_T("BCopyCopy");
static struct InitDialogItem InitDlg[]={
...
/* 2*/  {DI_EDIT,5,3,70,0,1,(DWORD_PTR)BCopyCopyHistoryName,DIF_HISTORY,0,_T("")},
};

struct FarDialogItem DialogItems[sizeofa(InitDlg)];
InitDialogItems(InitDlg,DialogItems,sizeofa(InitDlg));

Т. е. BCopyCopyHistoryName пишется в DWORD_PTR InitDialogItem.Selected, а потом функция InitDialogItems переписывает этот Selected в int FarDialogItem.Selected, пытаясь впихнуть невпихуемое, а именно 64 бита в 32. Что же в этом плохого?

Раньше оно у вас работало только потому, что звёзды удачно располагались - адрес литерала "BCopyCopy" укладывался в 32 бита, а стек, на который ложилась структура диалога, кто-то до этого случайно очищал (скорее всего там поблизости был вызов sprintf, который в 4834 убрали), обнуляя этим старшие биты адреса.

Иными словами - это баг плагина.

pult commented 7 years ago

https://forum.farmanager.com/viewtopic.php?p=142164#p142164

Кто соберёт, выложите плиз бинарник


bcopy_common.cpp(26) : error C2146: синтаксическая ошибка: отсутствие "," перед идентификатором "_Dest"
bcopy_common.cpp(26) : error C2733: вторая С-компоновка перегруженной функции "swprintf" не допускается
        bcopy_common.cpp(26): см. объявление "swprintf"

Из 2015 тоже, ошибки в той же стороке