View Issue Details

IDProjectCategoryView StatusLast Update
0003029Far ManagerDialogpublic2015-08-08 12:19
ReporterJohnDoeAssigned ToDrKnS 
PrioritynormalSeveritycrashReproducibilityalways
Status assignedResolutionopen 
Product Version3.0 
Target VersionFixed in Version 
Summary0003029: 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 ] ║
╚════════════════════════════════════════╝
TagsNo tags attached.
Build

Activities

shmuel

2015-07-18 15:30

developer   bugnote:0013709

Last edited: 2015-07-18 15:38

View 2 revisions

Вот этот скрипт (взятый отсюда: 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)

shmuel

2015-07-18 16:49

developer  

test.7z (4,172 bytes)

shmuel

2015-07-18 16:54

developer   bugnote:0013710

Чтобы не было сомнений по поводу Lua/LuaFAR (в том числе и у меня), сделал плагин на Си, который приводит к той же ошибке. Приложил плагин с исходниками (файл test.7z). Вызывать с комстроки - test:

DrKnS

2015-07-18 20:24

administrator   bugnote:0013711

Патч приложен.
Сорсфорж лежит, так что собираем сами, увы.

DrKnS

2015-07-18 20:26

administrator  

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)
 {
3029.diff (1,011 bytes)

shmuel

2015-07-18 21:14

developer   bugnote:0013712

@DrKnS
Патч не помог. Скрипт из моего первого поста вызывает прежнюю ошибку, а плагин на Си, хоть и ошибки не вызывает, но требует нажатия Esc для очистки комстроки и продолжения работы.

DrKnS

2015-07-18 21:17

administrator   bugnote:0013713

> требует нажатия Esc для очистки комстроки и продолжения работы

Диалог открыт же.

shmuel

2015-07-18 21:19

developer   bugnote:0013714

Об этом не подумал.

shmuel

2015-07-18 21:23

developer   bugnote:0013715

ОК, замени в Си-плагине вызов диалога на
    HANDLE hndl = Info.DialogInit(&Guid, &Guid, -1,50,105,31, NULL, items, 1, 0, 0, NULL, NULL);
и получаем exception снова.

DrKnS

2015-07-18 22:12

administrator   bugnote:0013716

Ситуация "нормальный диалог, но за экраном" - это, в принципе, ок.
Мало ли, может автор координаты между запусками сохраняет, а тут вдруг размер консоли изменился.

Диалог с отрицательной высотой - это заведомо не ок и чинить сие я смысла не вижу.
Всё на свете не проверишь, завтра кто-нибудь напишет DialogInit((FarDialogItem*)42) и всё упадёт точно так же.

JohnDoe

2015-07-18 22:15

updater   bugnote:0013717

Last edited: 2015-07-18 22:22

View 4 revisions

>Диалог с отрицательной высотой - это заведомо не ок
Очень просто запретить создавать такое.

Хотя разве CtrlF5 не позволяет убрать диалог выше/левее фара?
А, пардон, речь про высоту.

shmuel

2015-07-18 22:22

developer   bugnote:0013718

Ну вроде чинить никто не заставляет :)

Но есть разница между заведомо вредоносным кастом и параметром правильного типа, выходящим за пределы определённого диапазона. Например, Lua нельзя завалить никакими неправильными параметрами (и LuaFAR тоже). Если такой случай обнаруживается, он считается багом.

DrKnS

2015-07-18 22:31

administrator   bugnote:0013719

Ну вот и добавь проверку в Lua API :)

Речь же не о том, что сложно, а о том, что на С-уровне в этом смысла не очень много.
Особенно если вспомнить про void* Param2 во всяких SendMessage и XXXControl.

shmuel

2015-07-18 22:49

developer   bugnote:0013720

> Ну вот и добавь проверку в Lua API :)

Я (т.е. LuaFAR) сознательно, практически везде, передаю параметры в Фар без каких-либо проверок на корректность, т.к. это даёт возможность адекватно тестировать Фар, и благодаря чему было уже выявлено немало багов в Фаре.

shmuel

2015-07-18 23:01

developer   bugnote:0013721

Просто это один из тех немногих случаев, когда Фар можно завалить из Lua.
То, что Фар можно завалить из Си тысячью способов, это как бы само-собой понятно.

JohnDoe

2015-07-23 18:07

updater   bugnote:0013722

Ещё один способ завалить фар, это передать некорректные координаты в 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;
}

JohnDoe

2015-08-08 12:19

updater   bugnote:0013751

И ещё один, это задать некорректные координаты при создании диалога:
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"},})

Issue History

Date Modified Username Field Change
2015-07-18 02:17 JohnDoe New Issue
2015-07-18 15:30 shmuel Note Added: 0013709
2015-07-18 15:38 shmuel Note Edited: 0013709 View Revisions
2015-07-18 16:49 shmuel File Added: test.7z
2015-07-18 16:54 shmuel Note Added: 0013710
2015-07-18 20:20 DrKnS Assigned To => DrKnS
2015-07-18 20:20 DrKnS Status new => assigned
2015-07-18 20:23 DrKnS File Added: 3029.diff
2015-07-18 20:24 DrKnS Note Added: 0013711
2015-07-18 20:24 DrKnS Status assigned => feedback
2015-07-18 20:26 DrKnS File Deleted: 3029.diff
2015-07-18 20:26 DrKnS File Added: 3029.diff
2015-07-18 21:14 shmuel Note Added: 0013712
2015-07-18 21:17 DrKnS Note Added: 0013713
2015-07-18 21:19 shmuel Note Added: 0013714
2015-07-18 21:23 shmuel Note Added: 0013715
2015-07-18 22:12 DrKnS Note Added: 0013716
2015-07-18 22:15 JohnDoe Note Added: 0013717
2015-07-18 22:15 JohnDoe Status feedback => assigned
2015-07-18 22:16 JohnDoe Note Edited: 0013717 View Revisions
2015-07-18 22:17 JohnDoe Note Edited: 0013717 View Revisions
2015-07-18 22:22 JohnDoe Note Edited: 0013717 View Revisions
2015-07-18 22:22 shmuel Note Added: 0013718
2015-07-18 22:31 DrKnS Note Added: 0013719
2015-07-18 22:49 shmuel Note Added: 0013720
2015-07-18 23:01 shmuel Note Added: 0013721
2015-07-23 18:07 JohnDoe Note Added: 0013722
2015-08-08 12:19 JohnDoe Note Added: 0013751