Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 29 мар 2024, 06:39

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 07 авг 2019, 08:04 
Не в сети

Зарегистрирован: 21 дек 2012, 09:32
Сообщений: 53
Если в MemTableEh используются строковые поля TStringField больше 8kB, то получение данных из такого поля (.AsString) портит память.

Проверено на версии EhLib 9.2 Build 9.2.026, Delphi 10.3.1
Хотя файл MemTableEh.pas из версии EhLib 9.3 Build 9.3.031 содержит такой же код, следовательно, скорее всего, ошибка тоже присутствует. На более поздних версиях EhLib не проверялось.

================================================
В процедуру StringToStringValueBuffer приходит Buffer размером 8kB для строк меньше 8kB, и равный размеру строки, для строк бОльшего размера.
А внутри процедуры делается PAnsiChar(Buffer)[DataSize] := #0, что приводит к порче памяти за границей буфера для строк больше 8kB.
Вариант возможного исправления: StringToStringValueBuffer(Value, Buffer, Field.DataSize - 1)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 01 окт 2019, 07:31 
Не в сети

Зарегистрирован: 21 дек 2012, 09:32
Сообщений: 53
Хочется исправления, чтобы не патчить каждую версию руками.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 окт 2019, 07:33 
Не в сети

Зарегистрирован: 21 дек 2012, 09:32
Сообщений: 53
В версии EhLib 9.4 Build 9.4.019 ошибка так же присутствует.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 29 окт 2019, 11:19 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1546
1.
Есть ли возможность прислать или описать как создать пример, который воспроизводит ошибку?
На простом примере ошибка не воспроизводится.

2.
Согласно данной строке

Код:
  dsMaxStringSize = 8192; { Maximum string field size }

function TStringField.GetIOSize: Integer;
var
  MaxSize: Integer;
begin
  Result := DataSize;
  MaxSize := dsMaxStringSize + 1;
  if Result < MaxSize then
    Result := MaxSize;
end;

TStringField вообще не должен давать работать с данными больше 8192 байт.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 окт 2019, 05:56 
Не в сети

Зарегистрирован: 21 дек 2012, 09:32
Сообщений: 53
Надо запустить приложение из-под delphi и при закрытии FastMM выдаст ошибку про порченную память.

Код:
FastMM has detected an error during a FreeMem operation. The block footer has been corrupted.


Вложения:
teststringfield.7z [123.36 KiB]
Скачиваний: 44
Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 03 ноя 2019, 15:31 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1546
Добрый день.

Можете проверить следующее исправление?

Код:
unit MemTableEh;
...
procedure StringToStringValueBuffer(var Value: Variant; Buffer: TValueBuffer; DataSize: Integer);
begin
  PAnsiChar(Buffer)[DataSize-1] := #0;
  StrLCopy(PAnsiChar(Buffer), PAnsiChar(VarToAnsiStr(Value)), DataSize-1);
end;


Хочется понять, не будут ли съедаться последние символы.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 05 ноя 2019, 06:19 
Не в сети

Зарегистрирован: 21 дек 2012, 09:32
Сообщений: 53
Да, такое исправление не съедает последние символы.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB