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

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

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

Postby NightRoman » Tue 05 Apr, 2016 15:12

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

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

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

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

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

Если выглядит как ошибка, есть готовый скрипт PowerShellFar, показывающий проблему, причешу и прикреплю. Если это требование к плагину, то надо бы в энциклопедии это описать. Мне кажется, что скорее ошибка в Фаре. Нелогично записывать свои данные в структуру плагина перед вызовом FreeFindData.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Tue 05 Apr, 2016 15:30

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

Code: Select all

ps: .\Test-CrashFindF3-.ps1


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

Примечание. Падать может не всегда. Но описанная проблема (чужой адрес вместо 0) имеет место.
Attachments
Test-CrashFindF3-.ps1.7z
(713 Bytes) Downloaded 11 times

User avatar
DrKnS
Posts: 4434
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 101 times
Contact:

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

Postby DrKnS » Tue 05 Apr, 2016 19:29

Это баг.

User avatar
DrKnS
Posts: 4434
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 101 times
Contact:

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

Postby DrKnS » Tue 05 Apr, 2016 19:53

4611. Желательно проверить, ничего ли не отвалилось, особенно при поиске в старых панельных плагинах.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Tue 05 Apr, 2016 20:39

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

Спасибо!

Есть попутный вопрос, просто из любопытства. А зачем при F3 вызывается GetFindData и FreeFindData? По идее, все данные по файлам были получены ранее во время скана, их бы вроде и использовать при F3. Или не все так просто? Или это делается, чтобы гарантированно свежие данные получить (типа мало ли что поменялось во время поиска)? Словом, полезно было бы знать.

User avatar
DrKnS
Posts: 4434
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 101 times
Contact:

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

Postby DrKnS » Tue 05 Apr, 2016 21:03

Я тоже задался этим вопросом и попытался сделать проще, но всё начало падать.
Похоже, плагины ожидают GetFiles только в промежутке между соответствующими GetFindData и FreeFindData, а вот такой прекрасный код всё ломает:
  1. // force plugin to update its file list (that can be empty at this time)
  2. // if not done SetDirectory may fail
  3. {
  4.     size_t FileCount=0;
  5.     PluginPanelItem *PanelData=nullptr;
  6.     if (Global->CtrlObject->Plugins->GetFindData(hPlugin,&PanelData,&FileCount,OPM_SILENT))
  7.         Global->CtrlObject->Plugins->FreeFindData(hPlugin,PanelData,FileCount,true);
  8. }

Наверное, можно сделать нормально, но это надо полпоиска переписать.
Но на багтрекер написать имеет смысл, мало ли.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Wed 06 Apr, 2016 15:03

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

Скрипты для воспроизведения прикрепил. Указанные пути существенны. Также требуется, чтобы был плагин 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 5 times

User avatar
DrKnS
Posts: 4434
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 101 times
Contact:

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

Postby DrKnS » Wed 06 Apr, 2016 17:19

NightRoman wrote:Source of the postЕсть-таки регрессия
Уже полгода как. 4614.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Wed 06 Apr, 2016 18:02

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

UPD. Это не так, смотри далее. Вчерашнее изменение случайно совпало с тем, что проблема, кажется, проявляется только на моей рабочей машине, а я был в отпуске и на работе не тестировал. Если бы не отпуск, то очень вероятно, что я "поймал" бы момент регрессии вовремя.
Last edited by NightRoman on Thu 07 Apr, 2016 15:54, edited 1 time in total.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Wed 06 Apr, 2016 18:22

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

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

Ожидается, что вначале элемент "..", потом функция "A:" (обычно). В 4615 "A:" вначале, а ".." где-то посреди панели.

User avatar
DrKnS
Posts: 4434
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 2 times
Been thanked: 101 times
Contact:

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

Postby DrKnS » Wed 06 Apr, 2016 18:40

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

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

4616.
И да, всё это имеет очень мало отношения к исходной теме.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Wed 06 Apr, 2016 21:05

4616
Все тесты отработали. Но на этой машине и вчера не падало. Завтра проверю на других.

2useven10
Posts: 2833
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 72 times

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

Postby 2useven10 » Wed 06 Apr, 2016 21:21

В 4613 чинили баги закопанные в рефакторинге 4564.
Действительно не имеющие отношения к этой теме (там было задваивание "..").
Это вылезло, потому что заодно был убран сомнительный интеллект с принудительным
выставлением флага DIRECTORY для "..", но как оказалось кому-то он нужен.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Thu 07 Apr, 2016 10:48

@DrKnS, пример из test.7z у меня все еще падает на других машинах. И пока падает только 64-бит версия, стабильно. На той же машине падение на 32-бит пока не наблюдалось.

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Thu 07 Apr, 2016 14:02

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

User avatar
NightRoman
Posts: 5849
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 8 times
Been thanked: 8 times
Contact:

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

Postby NightRoman » Thu 07 Apr, 2016 14:25

Еще чуть точнее:
Far30b4584.x64.20160320.7z - не падает
Far30b4589.x64.20160322.7z - падает


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

Who is online

Users browsing this forum: No registered users and 3 guests