View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0003029 | Far Manager | Dialog | public | 2015-07-17 23:17 | 2019-09-24 09:01 |
Reporter | JohnDoe | Assigned To | DrKnS | ||
Priority | normal | Severity | crash | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Product Version | 3.0 | ||||
Summary | 0003029: Exception при попытке переместить диалог, находящийся за пределами экрана | ||||
Description | Фар позволяет создать диалог за пределами экрана: local X1 = 200 far.Dialog("",X1,-1,13,12,nil,{{far.Flags.DI_DOUBLEBOX,2,1,10,10,0}}) Но при нажатии CtrlF5 возникает исключение: ╔══════════ Exception occurred ══════════╗ ║ vector<T> too long ║ ╟────────────────────────────────────────╢ ║ { Terminate Far } [ Debug ] [ Ignore ] ║ ╚════════════════════════════════════════╝ | ||||
Tags | No tags attached. | ||||
Build | |||||
|
Вот этот скрипт (взятый отсюда: http://forum.farmanager.com/viewtopic.php?p=131300#p131300), если его запустить из редактора через меню LF4Ed / Lua Script - приводит к тому же сообщению об ошибке и без нажатия CtrlF5. local hDlg = far.DialogInit("",-1,50,105,31,nil,{{far.Flags.DI_DOUBLEBOX,2,1,10,10,0}},0,function()end) far.Show(far.DialogRun(hDlg)) far.DialogFree(hDlg) |
|
|
|
Чтобы не было сомнений по поводу Lua/LuaFAR (в том числе и у меня), сделал плагин на Си, который приводит к той же ошибке. Приложил плагин с исходниками (файл test.7z). Вызывать с комстроки - test: |
|
Патч приложен. Сорсфорж лежит, так что собираем сами, увы. |
|
3029.diff (1,011 bytes)
Index: interf.cpp =================================================================== --- interf.cpp (revision 13322) +++ interf.cpp (working copy) @@ -1276,3 +1276,13 @@ } return Result; } + +void fix_coordinates(int& X1, int& Y1, int& X2, int& Y2) +{ + const auto fix = [](int Min, int& Value, int Max) { Value = std::min(std::max(Min, Value), Max); }; + + fix(0, X1, ScrX); + fix(0, X2, ScrX); + fix(0, Y1, ScrY); + fix(0, Y2, ScrY); +} Index: interf.hpp =================================================================== --- interf.hpp (revision 13322) +++ interf.hpp (working copy) @@ -185,13 +185,7 @@ void InitRecodeOutTable(); -inline void fix_coordinates(int& X1, int& Y1, int& X2, int& Y2) -{ - X1 = std::max(X1, 0); - X2 = std::min(static_cast<int>(ScrX), X2); - Y1 = std::max(Y1, 0); - Y2 = std::min(static_cast<int>(ScrY), Y2); -} +void fix_coordinates(int& X1, int& Y1, int& X2, int& Y2); inline void SetVidChar(FAR_CHAR_INFO& CI,wchar_t Chr) { |
|
@DrKnS Патч не помог. Скрипт из моего первого поста вызывает прежнюю ошибку, а плагин на Си, хоть и ошибки не вызывает, но требует нажатия Esc для очистки комстроки и продолжения работы. |
|
> требует нажатия Esc для очистки комстроки и продолжения работы Диалог открыт же. |
|
Об этом не подумал. |
|
ОК, замени в Си-плагине вызов диалога на HANDLE hndl = Info.DialogInit(&Guid, &Guid, -1,50,105,31, NULL, items, 1, 0, 0, NULL, NULL); и получаем exception снова. |
|
Ситуация "нормальный диалог, но за экраном" - это, в принципе, ок. Мало ли, может автор координаты между запусками сохраняет, а тут вдруг размер консоли изменился. Диалог с отрицательной высотой - это заведомо не ок и чинить сие я смысла не вижу. Всё на свете не проверишь, завтра кто-нибудь напишет DialogInit((FarDialogItem*)42) и всё упадёт точно так же. |
|
>Диалог с отрицательной высотой - это заведомо не ок Очень просто запретить создавать такое. Хотя разве CtrlF5 не позволяет убрать диалог выше/левее фара? А, пардон, речь про высоту. |
|
Ну вроде чинить никто не заставляет :) Но есть разница между заведомо вредоносным кастом и параметром правильного типа, выходящим за пределы определённого диапазона. Например, Lua нельзя завалить никакими неправильными параметрами (и LuaFAR тоже). Если такой случай обнаруживается, он считается багом. |
|
Ну вот и добавь проверку в Lua API :) Речь же не о том, что сложно, а о том, что на С-уровне в этом смысла не очень много. Особенно если вспомнить про void* Param2 во всяких SendMessage и XXXControl. |
|
> Ну вот и добавь проверку в Lua API :) Я (т.е. LuaFAR) сознательно, практически везде, передаю параметры в Фар без каких-либо проверок на корректность, т.к. это даёт возможность адекватно тестировать Фар, и благодаря чему было уже выявлено немало багов в Фаре. |
|
Просто это один из тех немногих случаев, когда Фар можно завалить из Lua. То, что Фар можно завалить из Си тысячью способов, это как бы само-собой понятно. |
|
Ещё один способ завалить фар, это передать некорректные координаты в DM_RESIZEDIALOG Macro { area="Dialog"; key="F1"; action=function() local hDlg = far.AdvControl("ACTL_GETWINDOWINFO").Id hDlg:send("DM_RESIZEDIALOG",0,{X=-10,Y=-10}) end; } |
|
И ещё один, это задать некорректные координаты при создании диалога: far.Dialog("",0,3,10,0,nil,{{"DI_TEXT",0,0,10,0,0,nil,nil,0,"sample"},},0,function()end) Интересно, что падает только при наличии обработчика, т.е. вот так уже не падает: far.Dialog("",0,3,10,0,nil,{{"DI_TEXT",0,0,10,0,0,nil,nil,0,"sample"},}) |
|
В актуальных билдах не воспроизводится: диалог с такими параметрами просто не создаётся. |
Date Modified | Username | Field | Change |
---|---|---|---|
2015-07-17 23:17 | JohnDoe | New Issue | |
2015-07-18 12:30 | shmuel | Note Added: 0013709 | |
2015-07-18 12:38 | shmuel | Note Edited: 0013709 | |
2015-07-18 13:49 | shmuel | File Added: test.7z | |
2015-07-18 13:54 | shmuel | Note Added: 0013710 | |
2015-07-18 17:20 | DrKnS | Assigned To | => DrKnS |
2015-07-18 17:20 | DrKnS | Status | new => assigned |
2015-07-18 17:23 | DrKnS | File Added: 3029.diff | |
2015-07-18 17:24 | DrKnS | Note Added: 0013711 | |
2015-07-18 17:24 | DrKnS | Status | assigned => feedback |
2015-07-18 17:26 | DrKnS | File Deleted: 3029.diff | |
2015-07-18 17:26 | DrKnS | File Added: 3029.diff | |
2015-07-18 18:14 | shmuel | Note Added: 0013712 | |
2015-07-18 18:17 | DrKnS | Note Added: 0013713 | |
2015-07-18 18:19 | shmuel | Note Added: 0013714 | |
2015-07-18 18:23 | shmuel | Note Added: 0013715 | |
2015-07-18 19:12 | DrKnS | Note Added: 0013716 | |
2015-07-18 19:15 | JohnDoe | Note Added: 0013717 | |
2015-07-18 19:15 | JohnDoe | Status | feedback => assigned |
2015-07-18 19:16 | JohnDoe | Note Edited: 0013717 | |
2015-07-18 19:17 | JohnDoe | Note Edited: 0013717 | |
2015-07-18 19:22 | JohnDoe | Note Edited: 0013717 | |
2015-07-18 19:22 | shmuel | Note Added: 0013718 | |
2015-07-18 19:31 | DrKnS | Note Added: 0013719 | |
2015-07-18 19:49 | shmuel | Note Added: 0013720 | |
2015-07-18 20:01 | shmuel | Note Added: 0013721 | |
2015-07-23 15:07 | JohnDoe | Note Added: 0013722 | |
2015-08-08 09:19 | JohnDoe | Note Added: 0013751 | |
2019-09-24 09:01 | JohnDoe | Status | assigned => closed |
2019-09-24 09:01 | JohnDoe | Resolution | open => fixed |
2019-09-24 09:01 | JohnDoe | Note Added: 0016601 |