View Issue Details

IDProjectCategoryView StatusLast Update
0000790Far ManagerMacropublic2009-03-19 08:53
Reporteralexeypa Assigned Tovskirdin  
PrioritynormalSeveritycrashReproducibilityrandom
Status closedResolutionfixed 
Fixed in Version2.0 
Summary0000790: Buffer overrun in KeyMacro::GetIndex
DescriptionKeyMacro::GetIndex не проверяет переданный ChechMode на выход за пределы массива KeyMacro::IndexMode. В определённых условиях в функцию передается ChechMode равный MACRO_LAST. Это значение устанавливается в функции CheckForEscSilent:

  if (Processed && PeekInputRecord(&rec))
  {
    int MMode=CtrlObject->Macro.GetMode();
    CtrlObject->Macro.SetMode(MACRO_LAST); // BUGBUG?
    Key=GetInputRecord(&rec);
    CtrlObject->Macro.SetMode(MMode);

Repro:

1. Добавить в реестр немного клавиатурных макросов. См. прикрепленный shortcuts.reg. Он в неправильной кодировке - это так и задумывалось, хотя в данном случае это неважно.
2. Запустить x64 Far 2.0 под AppVerifier.
3. Начать копирование большого файла. В моем случае файл копируется на сетевой диск. Не думаю, что это важно.
4. Прервать копирование нажав Esc.
5. Нажать Yes в окне сообщения для подтверждления.

Здесь Far иногда вылится по Access Violation.

Я прикрепил возможныу вариант заплатки, добавляющий проверку индекса в KeyMacro::GetIndex. ОВзможен и другой вариант с заменой MACRO_LAST на MACRO_COMMON при вызове SetMode в CheckForEscSilent:

CtrlObject->Macro.SetMode(MACRO_COMMON);

Это зависит от того, что имел ввиду автор этого кода.
TagsNo tags attached.
Build828

Activities

2009-03-15 22:35

 

shortcuts.reg (3,109 bytes)

2009-03-15 22:36

 

0001-A-proposed-fix-for-buffer-overrun-in-KeyMacro-GetIn.patch (1,020 bytes)   
From 2930bd3ac5998d6cf2f179467b1382bd1b62dc1e Mon Sep 17 00:00:00 2001
From: Alexey Pakhunov <alexeypa@gmail.com>
Date: Sun, 15 Mar 2009 15:19:21 -0700
Subject: [PATCH] A proposed fix for buffer overrun in KeyMacro::GetIndex.

---
 unicode_far/macro.cpp |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/unicode_far/macro.cpp b/unicode_far/macro.cpp
index e3e3dbc..24ccbd4 100644
--- a/unicode_far/macro.cpp
+++ b/unicode_far/macro.cpp
@@ -4511,13 +4511,17 @@ int KeyMacro::GetIndex(int Key, int ChechMode, bool UseCommon)
         Len=MacroLIBCount;
         MPtr=MacroLIB;
       }
-      else
+      else if (ChechMode >= 0 && ChechMode < MACRO_LAST)
       {
         Len=IndexMode[ChechMode][1];
         if(Len)
           MPtr=MacroLIB+IndexMode[ChechMode][0];
   //_SVS(SysLog(L"ChechMode=%d (%d,%d)",ChechMode,IndexMode[ChechMode][0],IndexMode[ChechMode][1]));
       }
+      else
+      {
+        Len=0;
+      }
 
       if(Len)
       {
-- 
1.6.2.1217.gd7bc3

vskirdin

2009-03-17 07:27

administrator   bugnote:0002790

> ОВзможен и другой вариант с заменой MACRO_LAST на MACRO_COMMON
не это не катит.
(вот вспомнить бы... зачем именно MACRO_LAST использовался в CheckForEscSilent :-))

подобную правку в 1.7 делать?

alexeypa

2009-03-17 14:20

reporter   bugnote:0002796

> (вот вспомнить бы... зачем именно MACRO_LAST использовался в CheckForEscSilent :-))

Как вариант - чтобы временно отключить отработку макросов?

vskirdin

2009-03-17 16:33

administrator   bugnote:0002797

да, видимо так.

vskirdin

2009-03-18 19:49

administrator   bugnote:0002807

build 828

Issue History

Date Modified Username Field Change
2009-03-15 22:35 alexeypa New Issue
2009-03-15 22:35 alexeypa Status new => assigned
2009-03-15 22:35 alexeypa Assigned To => vskirdin
2009-03-15 22:35 alexeypa File Added: shortcuts.reg
2009-03-15 22:36 alexeypa File Added: 0001-A-proposed-fix-for-buffer-overrun-in-KeyMacro-GetIn.patch
2009-03-17 07:27 vskirdin Note Added: 0002790
2009-03-17 14:20 alexeypa Note Added: 0002796
2009-03-17 16:33 vskirdin Note Added: 0002797
2009-03-18 19:49 vskirdin Note Added: 0002807
2009-03-18 19:49 vskirdin Status assigned => feedback
2009-03-18 22:17 alexeypa Status feedback => resolved
2009-03-18 22:17 alexeypa Resolution open => fixed
2009-03-19 08:53 vskirdin Build => 828
2009-03-19 08:53 vskirdin Status resolved => closed
2009-03-19 08:53 vskirdin Fixed in Version => 2.0