Как-как, заходим по F1, читаем там, а потом по ESC выходим, и
тут то санитайзер и срабатывает
==6255==ERROR: AddressSanitizer: heap-use-after-free on address[бла..бла..бла]
0x60800001226c at pc 0x000000b4c1d5 bp 0x7ffdfdc2f5b0 sp
0x7ffdfdc2f5a8 READ of size 2 at 0x60800001226c thread T0
#0 0xb4c1d4 in getxch(int)
/home/fido/src/golded-plus/goldlib/gcui/gkbdgetm.cpp:319
#1 0xb81225 in wmenuget()
- setonkey(Key_Esc,esc_esc,0);
+ setonkey(Key_Esc,NULL,0);
То есть ты просто отключил обработчики этих клавиш? Отличный фикс!
Как-как, заходим по F1, читаем там, а потом по ESC выходим, и
тут то санитайзер и срабатывает
==6255==ERROR: AddressSanitizer: heap-use-after-free on address[бла..бла..бла]
0x60800001226c at pc 0x000000b4c1d5 bp 0x7ffdfdc2f5b0 sp
0x7ffdfdc2f5a8 READ of size 2 at 0x60800001226c thread T0
#0 0xb4c1d4 in getxch(int)
/home/fido/src/golded-plus/goldlib/gcui/gkbdgetm.cpp:319
#1 0xb81225 in wmenuget()
- setonkey(Key_Esc,esc_esc,0);
+ setonkey(Key_Esc,NULL,0);
То есть ты просто отключил обработчики этих клавиш? Отличный
фикс!
Да, никрута так фиксить, конечно, подловил.
Тогда вот так пофиксю, вольёшь?
diff --git a/goldlib/gcui/gkbdgetm.cpp b/goldlib/gcui/gkbdgetm.cpp
--- a/goldlib/gcui/gkbdgetm.cpp
+++ b/goldlib/gcui/gkbdgetm.cpp
@@ -310,6 +310,7 @@ gkey getxch(int __tick)
if(gkbd->inmenu and gmou.FreeCursor())
return 0;
#endif
+ _onkey = gkbd->onkey;
break;
}
_onkey = _onkey->prev;
Глобальные переменные - это зло. огда мы отрабатываем клавишу ESC, то esc_esc() вычистит себя, и doubly-linked list останется пустым, т.е. gkbd->onkey уже освобождённым оказывается.
diff --git a/goldlib/gcui/gkbdgetm.cpp
b/goldlib/gcui/gkbdgetm.cpp
--- a/goldlib/gcui/gkbdgetm.cpp
+++ b/goldlib/gcui/gkbdgetm.cpp
@@ -310,6 +310,7 @@ gkey getxch(int __tick)
if(gkbd->inmenu and gmou.FreeCursor())
return 0;
#endif
+ _onkey = gkbd->onkey;
break;
}
_onkey = _onkey->prev;
Глобальные переменные - это зло. огда мы отрабатываем клавишу
ESC, то esc_esc() вычистит себя, и doubly-linked list останется
пустым, т.е. gkbd->onkey уже освобождённым оказывается.
Можешь вкратце описать, в чём проблема и как твой фикс её решает? Патч подготовлю.
diff --git a/goldlib/gcui/gkbdgetm.cpp
b/goldlib/gcui/gkbdgetm.cpp
--- a/goldlib/gcui/gkbdgetm.cpp
+++ b/goldlib/gcui/gkbdgetm.cpp
@@ -310,6 +310,7 @@ gkey getxch(int __tick)
if(gkbd->inmenu and gmou.FreeCursor())
return 0;
#endif
+ _onkey = gkbd->onkey;
break;
}
_onkey = _onkey->prev;
Глобальные переменные - это зло. огда мы отрабатываем клавишу
ESC, то esc_esc() вычистит себя, и doubly-linked list останется
пустым, т.е. gkbd->onkey уже освобождённым оказывается.
Можешь вкратце описать, в чём проблема и как твой фикс её решает?
Патч подготовлю.
gkbd - глобальный объект для работы с вводом. Синглтон напрашивается,
но тут просто глобал. gkbd->onkey - doubly linked list какие мы готовы обрабатывать клавиши с их колбеками. Там цикл по этому листу, если совпало, то вызываем колбек. Проблема случается в F1 помощи, если
нажимать pageup, pagedown, esc клавиши. Запуститься их обработчик, например, esc_esc(), который первым делом вызовет
setonkey(Key_Esc,NULL,0) и уберёт себя из этого linked list. Далее там
в getxch() стоит break после обработки, а потом if, чтобы key to pass back, 0=don't pass.
Sysop: | Angel Ripoll |
---|---|
Location: | Madrid, Spain |
Users: | 11 |
Nodes: | 8 (0 / 8) |
Uptime: | 53:39:58 |
Calls: | 303 |
Files: | 2,759 |
Messages: | 61,484 |