• Заезды по памяти по F1

    From Nil A@2:5015/46 to Vitaliy Aksyonov on Sat Oct 28 06:38:58 2023
    Hello, Vitaliy!

    Thursday October 26 2023 07:34, from Vitaliy Aksyonov -> Nil A:

    Как-как, заходим по 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 уже освобождённым оказывается.

    Best Regards, Nil
    --- GoldED+/LNX 1.1.5
    * Origin: Linux 2.6.32-042stab145.3 (2:5015/46)
  • From Vitaliy Aksyonov@1:104/117 to Nil A on Fri Oct 27 22:25:54 2023
    Привет, Nil!

    28 Oct 23 06:38, ты писал(а) мне:

    Как-как, заходим по 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 уже освобождённым оказывается.

    Можешь вкратце описать, в чём проблема и как твой фикс её решает? Патч подготовлю.

    Best regards,
    Vitaliy Aksyonov.

    ... Трудись, трудись, труд из тебя человека сделает!
    --- GoldED+/LNX 1.1.5-b20231021
    * Origin: Aurora, Colorado (1:104/117)
  • From Nil A@2:5015/46 to Vitaliy Aksyonov on Sat Oct 28 08:27:04 2023
    Hello, Vitaliy!

    Friday October 27 2023 22:25, from Vitaliy Aksyonov -> Nil A:

    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.
    Главное, что в этом месте esc_esc() был единственным в linked list, поэтому он весь и освобождается, считай весь gkbd->onkey nullptr.
    Это ещё Одинновский баг там похоже. и у кого не падает, потому что освобождается и тут же используется снова, там просто других маллоков нет рядом, поэтому память не трогается никем больше.

    Best Regards, Nil
    --- GoldED+/LNX 1.1.5
    * Origin: Linux 2.6.32-042stab145.3 (2:5015/46)
  • From Nil A@2:5015/46 to Vitaliy Aksyonov on Sat Oct 28 08:59:34 2023
    Hello, Vitaliy!

    Saturday October 28 2023 08:27, from Nil A -> Vitaliy Aksyonov:

    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.

    Я немного соврал. Падает на ESC, потому что он себя из списка вынимает, и эта такущая _onkey становится уже освобождённой. Мой фикс на начало линкед-листа переходит. Может быть это и не правильно.

    Best Regards, Nil
    --- GoldED+/LNX 1.1.5
    * Origin: Linux 2.6.32-042stab145.3 (2:5015/46)