Можно ли присваивать AlternateFileName нулевой адрес?

Место, где разработчики плагинов могут поделиться своим опытом.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

Речь про панель плагина. Из опыта, в некоторых случаях можно присвоить AlternateFileName нулевой адрес, и это не вызывает проблем. В энциклопедии вроде тоже говорится, что за выделение памяти тут отвечает плагин, то есть как бы дело плагина, что тут присваивать и потом освобождать.

Но есть особая ситуация, где нулевой адрес в AlternateFileName приводит к падению:

- в панели плагина вызываем поиск (AltF7), ищем все
- найденные файлы показаны в диалоге результатов
- жмем F3 на одном из найденных файлов
- в этот момент Фар вызывает GetFindData, где плагин возвращает данные с AlternateFileName = 0
- вслед за этим Фар вызывает FreeFindData, и вот тут у данных AlternateFileName не равен 0 (кажется, там указатель на пустую строку обычно, но может это и случайно)

При удалении этого ненулевого указателя происходит падение, плагин не выделял эту память.

Вопрос: это ошибка в Фаре или в такой особой ситуации плагин обязан свои данные записать в AlternateFileName?

Если выглядит как ошибка, есть готовый скрипт PowerShellFar, показывающий проблему, причешу и прикреплю. Если это требование к плагину, то надо бы в энциклопедии это описать. Мне кажется, что скорее ошибка в Фаре. Нелогично записывать свои данные в структуру плагина перед вызовом FreeFindData.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

Выкладываю скрипт. Запускать командой PowerShellFar

Code: Select all

ps: .\Test-CrashFindF3-.ps1
Для простоты лучше его в отдельную папку положить. Панель будет показывать файлы в этой папке. С одним файлом будет проще. Далее шаги, как описаны выше.

Примечание. Падать может не всегда. Но описанная проблема (чужой адрес вместо 0) имеет место.
Attachments
Test-CrashFindF3-.ps1.7z
(713 Bytes) Downloaded 79 times
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Можно ли присваивать AlternateFileName нулевой адрес?

Post by DrKnS »

Это баг.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Можно ли присваивать AlternateFileName нулевой адрес?

Post by DrKnS »

4611. Желательно проверить, ничего ли не отвалилось, особенно при поиске в старых панельных плагинах.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

Скрипт работает, не падает. Тесты отработали. Арклайт с поиском вроде работает. Старых панельных плагинов нет :)

Спасибо!

Есть попутный вопрос, просто из любопытства. А зачем при F3 вызывается GetFindData и FreeFindData? По идее, все данные по файлам были получены ранее во время скана, их бы вроде и использовать при F3. Или не все так просто? Или это делается, чтобы гарантированно свежие данные получить (типа мало ли что поменялось во время поиска)? Словом, полезно было бы знать.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Можно ли присваивать AlternateFileName нулевой адрес?

Post by DrKnS »

Я тоже задался этим вопросом и попытался сделать проще, но всё начало падать.
Похоже, плагины ожидают GetFiles только в промежутке между соответствующими GetFindData и FreeFindData, а вот такой прекрасный код всё ломает:
  1. // force plugin to update its file list (that can be empty at this time)
  2.  
  3. // if not done SetDirectory may fail
  4.  
  5. {
  6.  
  7.     size_t FileCount=0;
  8.  
  9.     PluginPanelItem *PanelData=nullptr;
  10.  
  11.     if (Global->CtrlObject->Plugins->GetFindData(hPlugin,&PanelData,&FileCount,OPM_SILENT))
  12.  
  13.         Global->CtrlObject->Plugins->FreeFindData(hPlugin,PanelData,FileCount,true);
  14.  
  15. }
Наверное, можно сделать нормально, но это надо полпоиска переписать.
Но на багтрекер написать имеет смысл, мало ли.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

Есть-таки регрессия, просто не всегда проявлялась. Где-то портится память и в результате иногда падает.

Скрипты для воспроизведения прикрепил. Указанные пути существенны. Также требуется, чтобы был плагин TmpPanel и чтобы он открывал файлы с расширением .temp на временной панели (так, вроде, по умолчанию).

- Оба скрипта из архива положить в папку C:\TEMP\test
- Перейти туда и запустить их в специальном "тестовом" режиме командой

Code: Select all

ps: Invoke-FarStepper .\Test-Panel-OverNative..ps1
Что при этом будет выполнено:

- Скрипт Test-Panel-OverNative..ps1 создает файл C:\TEMP\temp.temp и пишет туда путь до Far.exe
- Затем делается переход на этот файл в панели (тут, кажется, важно, что файл в другой папке)
- Делается Enter на этом файле, в результате открывается временная панель, там файл Far.exe
- Затем запускается панель другого плагина (Фарнет) поверх временной панели (это вызов второго скрипта Test-Panel-.ps1)

В этот момент падаем. Под отладчиком пишет, что память испорчена, других деталей у меня нет. С исходниками Фара, может, понятнее будет.

Если понадобится, то то же самое можно выполнять несколько другой командой с подтверждением каждого шага:

Code: Select all

ps: Invoke-FarStepper .\Test-Panel-OverNative..ps1 -Ask
Attachments
test.7z
(2.81 KiB) Downloaded 65 times
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Можно ли присваивать AlternateFileName нулевой адрес?

Post by DrKnS »

NightRoman wrote:Есть-таки регрессия
Уже полгода как. 4614.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

Забавно. А у меня этому тесту уже несколько лет, и проблема проявилась только со вчерашним изменением. И то не на всех машинах, вчерашнее домашнее тестирование было "успешным".

UPD. Это не так, смотри далее. Вчерашнее изменение случайно совпало с тем, что проблема, кажется, проявляется только на моей рабочей машине, а я был в отпуске и на работе не тестировал. Если бы не отпуск, то очень вероятно, что я "поймал" бы момент регрессии вовремя.
Last edited by NightRoman on Thu 07 Apr, 2016 15:54, edited 1 time in total.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

4615
Кое-что отвалилось. Скрипт на этот раз не нужен (пока).

- Выполнить через меню: F11 \ PowerShellFar \ Power panel \ Function:
- Открывается панель функций PowerShell

Ожидается, что вначале элемент "..", потом функция "A:" (обычно). В 4615 "A:" вначале, а ".." где-то посреди панели.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Можно ли присваивать AlternateFileName нулевой адрес?

Post by DrKnS »

Потому что у тебя ".." - не папка (нет FILE_ATTRIBUTE_DIRECTORY), вот он и сортируется как regular file.

Это зачем-то поломали в 4613.

4616.
И да, всё это имеет очень мало отношения к исходной теме.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

4616
Все тесты отработали. Но на этой машине и вчера не падало. Завтра проверю на других.
2useven10
Posts: 5204
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 18 times
Been thanked: 310 times

Можно ли присваивать AlternateFileName нулевой адрес?

Post by 2useven10 »

В 4613 чинили баги закопанные в рефакторинге 4564.
Действительно не имеющие отношения к этой теме (там было задваивание "..").
Это вылезло, потому что заодно был убран сомнительный интеллект с принудительным
выставлением флага DIRECTORY для "..", но как оказалось кому-то он нужен.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

@DrKnS, пример из test.7z у меня все еще падает на других машинах. И пока падает только 64-бит версия, стабильно. На той же машине падение на 32-бит пока не наблюдалось.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Можно ли присваивать AlternateFileName нулевой адрес?

Post by NightRoman »

4572 у меня не падает с примером из test.7z
Post Reply

Return to “Разработка плагинов”