GOLDED.DEVEL------------- < Пред. | След. > -- < @ > -- < Сообщ. > -- < Эхи > --
 Nп/п : 65 из 87
 От   : Nil A                               2:5015/46         09 мар 24 07:15:02
 К    : All                                                   09 мар 24 08:00:02
 Тема : Падение на удалённом сообщении в базе Squish
----------------------------------------------------------------------------------
                                                                                 
@MSGID: 2:5015/46 65ebecb2
@REPLY: 2:5030/1081.143 65eb635d
@CHRS: CP866 2
@TZUTC: 0300
@TID: hpt/lnx 1.9
 *** Answering a message in area ru.golded (2:50 Bone: Редактоp
сообщений GoldED).

Hello, All!

Friday March 08 2024 23:06, from Gleb Hlebov -> All:

 GH> Если зайти в [непустой] Netmail и написать письмо ареафиксу (а может,
 GH> и любое с пометкой K/S), после чего не выходить из нетмейла и
 GH> оставаться на бывшем последним сообщении (Msg: 999 of 1000), затем
 GH> параллельно запустить отправку почты (hpt scan pack -> binkd) и после
 GH> окончания сессии нажать в деде "->" -- он стреляется.

 У меня воспроизводится на базе Squish, про другие не знаю, говорят
на MSG всё хорошо.
Шаги для воспроизведения:
1. Пишем письмо (netmail) с флагом K/S.
2. Отходим на предыдущее письмо.
 3. Запускаем запаковку почты, и треккер/тоссер удалит это последнее
сообщение помеченное K/S.
4. Нажимаем клавишу вперед, чтобы перейти на это последнее сообщение, Oops.

 Эхотаг уходит в SquishArea::load_message(), успешно читает SQD фрейм
этого последнего сообщения, идёт выделять память под заголовки и текст
сообщения.
 Сообщение при этом удалено, тип у него 1 (SQFRAME_FREE), размер
заголовков ctlsize 0, размер текста сообщения totsize 0, но сам фрейм
(capacity) 440.
(gdb) p _frm
 $15 = {id = 2947433555, next = 0, prev = 0, length = 440,
totsize = 0, ctlsize = 0, type = 1, reserved = 0}

Как думаете, какой размер вычислится?
 95 char* _dest = __msg->txt = (char*)throw_calloc(1,
(uint)(1+_frm.ctlsize+_frm.totsize-sizeof(SqshHdr)));

 Правильно, из нуля вычтется размер заголовка и мы поросим у системы
много-много памяти.
(gdb) s
 throw_calloc_debug (__items=1, __size=4294967059, __file=0x6074b0
"/home/fido/src/golded-plus/goldlib/gmb3/gmosqsh3.cpp", __line=95) at /home/fido/src/golded-plus/goldlib/gall/gmemdbg.cpp:318
318         __size *= __items;

Дальше есть два варианта развития событий.
 1. Столько памяти система дать не может и процесс прибивается
(OOMkiller в Linux).
 2. У нас настроен overcommit по памяти, алокация проходит, но дальше
есть проверки в коде и в лог напишет вот такое:
----------  Sat 09 Mar 24, GoldED+/LNX 1.1.5-b20240306 (Mar  9 2024 02:09:11)
! 05:12:00  SquishArea::load_message: can`t read Squish message text
: 05:12:00  Info: Your msgbase is corrupted.
+ 05:12:00  Advice: Run a msgbase index rebuild/recover utility.

 Ниже привожу патч. С ним у меня в лог пишется ошибка, эхотаг
показывает пустое письмо, но не падает. Если выйти из текущей area (netmail) и
снова зайти, то индексы перечитаются и удалённого сообщения вообще не
покажется.
----------  Sat 09 Mar 24, GoldED+/LNX 1.1.5-b20240306 (Mar  9 2024 02:09:11)
! 07:13:17  SquishArea::load_message: reln=1674 frame type=1 is not normal
! 07:14:02  SquishArea::load_message: reln=1674 frame type=1 is not normal
! 07:14:06  SquishArea::load_message: reln=1674 frame type=1 is not normal

#
-Begin file 0001-Fixed-a-bug-crash-when-GoldED-opens-a-message-in-the.patch-
From 0a5f37b85b218e64c24c001f4174cafe27c09e82 Mon Sep 17 00:00:00 2001
From: Nil Alexandrov <nil.alexandrov@gmail.com>
Date: Sat, 9 Mar 2024 07:58:08 +0300
Subject: [PATCH] Fixed a bug/crash when GoldED opens a message in the current
 area which has been deleted outside of GoldED.

This bug leads to enormous memory allocation size and GoldED will either be
killed (OOMKiller) or exit with the Squish msgbase corruption message in log.
-+-
 goldlib/gmb3/gmosqsh3.cpp | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/goldlib/gmb3/gmosqsh3.cpp b/goldlib/gmb3/gmosqsh3.cpp
index ada1bd5..37834b9 100644
--- a/goldlib/gmb3/gmosqsh3.cpp
+++ b/goldlib/gmb3/gmosqsh3.cpp
 @@ -69,6 +69,14 @@ int SquishArea::load_message(int __mode, gmsg*
__msg, SqshHdr& __hdr)
         return false;
     }

+    // Check if this frame is normal
+    if (_frm.type != SQFRAME_NORMAL)
+    {
 + WideLog->printf("! SquishArea::load_message: reln=%d frame type=%d is
not normal", _reln, (int)_frm.type);
+        GFTRK(0);
+        return false;
+    }
+
     // Load the message header
     __hdr = SqshHdr();
     rwresult = read(_fhsqd, &__hdr, sizeof(SqshHdr));
 @@ -87,10 +95,8 @@ int SquishArea::load_message(int __mode, gmsg*
__msg, SqshHdr& __hdr)
     // Read control info and message text
     if(__mode & GMSG_TXT)
     {
-
-        if(_frm.length)
+        if(_frm.ctlsize+_frm.totsize >= sizeof(SqshHdr))
         {
-
  // Allocate memory for kludges and message text, then read control
info
  char* _dest = __msg->txt = (char*)throw_calloc(1,
(uint)(1+_frm.ctlsize+_frm.totsize-sizeof(SqshHdr)));
             char* _src = _dest + (uint)_frm.ctlsize;
--
1.9.1

-End file 0001-Fixed-a-bug-crash-when-GoldED-opens-a-message-in-the.patch-
Best Regards, Nil
--- GoldED+/LNX 1.1.5
 * Origin: Linux 2.6.32-042stab145.3 (2:5015/46)
SEEN-BY: 104/117 460/58 463/68 5005/49 5015/46 255
5019/40 5020/715 848 1042
SEEN-BY: 5020/4441 12000 5023/24 5025/121 5030/49
1081 5053/58 5058/104
SEEN-BY: 6078/80
@PATH: 5015/46 5020/1042 4441



   GoldED+ VK   │                                                 │   09:55:30    
                                                                                
В этой области больше нет сообщений.

Остаться здесь
Перейти к списку сообщений
Перейти к списку эх