УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

[BugFixed] VCAEngine: segfault при пустых полях в таблице стилей


Автор Сообщение
Сообщение создано: 12. 05. 2021 [04:24]
psn8402
Сергей Петрушкин
Создатель темы
Зарегистрирован(а) с: 12.05.2021
Сообщения: 3
В процессе конфигурирования свойств страницы я ошибся, и установил конфигурацию "Из стиля" свойству backImg. Соответствующая запись была автоматически добавлена в таблицу *_stl, и значения всех полей V_? выставлены пустыми строками. После перезапуска проекта Опенскада падала при попытке запуска рантайма и при попытке открытия вкладки "Стили" в QtCfg. Выяснил следующее:

src/moduls/ui/VCAEngine/project.cpp строка 217:
JAVASCRIPT
for(int fldCnt = 0; SYS->db().at().dataSeek(fullDB()+"_stl",nodePath()+tbl()+"_stl",fldCnt++,cStl,false,true); ) {
	vlst.clear();
	for(int iS = 0; iS < 10; iS++) {
	    svl = cStl.cfg(TSYS::strMess("V_%d",iS)).getS();
	    if(svl.empty()) break;
	    vlst.push_back(svl);
	}
	mStProp[cStl.cfg("ID").getS()] = vlst;
    }

Если встречается пустая строка - значение не добавляется в список. В результате соответствующий элемент mStProp остаётся пустым списком.

src/moduls/ui/VCAEngine/project.cpp строка 804:
JAVASCRIPT
if(n_vl)	n_vl->childAdd("el")->setText(iStPrp->second[stlCurent()]);

Здесь возвращается нулевая ссылка при попытке получения элемента пустого списка iStPrp->second. Это приводит к сегфолту внутри метода setText.

Написал такой патч. Решение неидеальное, при желании всё ещё можно вызвать сегфолт. Например, стерев названия стилей и попытавшись добавить новый стиль в QtCfg. Но это уже специально нужно стараться.
JAVASCRIPT
Index: src/moduls/ui/VCAEngine/project.cpp
===================================================================
--- src/moduls/ui/VCAEngine/project.cpp	(revision 2747)
+++ src/moduls/ui/VCAEngine/project.cpp	(working copy)
@@ -214,11 +214,22 @@
     TConfig cStl(&mod->elPrjStl());
     string svl;
     vector<string> vlst;
+    int stlCnt = 0;
     for(int fldCnt = 0; SYS->db().at().dataSeek(fullDB()+"_stl",nodePath()+tbl()+"_stl",fldCnt++,cStl,false,true); ) {
+	if (cStl.cfg("ID").getS() == "<Styles>") {
+	    int i;
+	    for(i = 0; i < 10; i++) {
+		svl = cStl.cfg(TSYS::strMess("V_%d",i)).getS();
+		if(svl.empty()) break;
+	    }
+	    stlCnt = i;
+	    break;
+	}
+    }
+    for(int fldCnt = 0; SYS->db().at().dataSeek(fullDB()+"_stl",nodePath()+tbl()+"_stl",fldCnt++,cStl,false,true); ) {
 	vlst.clear();
-	for(int iS = 0; iS < 10; iS++) {
+	for(int iS = 0; iS < stlCnt; iS++) {
 	    svl = cStl.cfg(TSYS::strMess("V_%d",iS)).getS();
-	    if(svl.empty()) break;
 	    vlst.push_back(svl);
 	}
 	mStProp[cStl.cfg("ID").getS()] = vlst;

Сообщение создано: 12. 05. 2021 [07:09]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3742
Исправлено!

Learn, learn and learn better than work, work and work.



12218