2015-10-01 3 views
2

После добавления вызова на сайт https на нашем сервере данных DataSnap он начал сбой при завершении.Delphi XE7/10 Seattle DataSnap OpenSSL Нарушение доступа при завершении

Аварии на Data.DBXOpenSSL.pas более конкретно по этому методу:

class procedure TRSACypher.ClearKey(var AKey: PRSAPeer); 
begin 
    if AKey <> nil then 
    IPPeerProcs._RSA_free(AKey); // Crash here 
    AKey := nil; 
end; 

Исключение составляет:

First chance exception at $00000000. Exception class $C0000005 with message 'access violation at 0x00000000: read of address 0x00000000'. Process Project1.exe (3996)

я написал проект, который воспроизводит эту проблему и он падает на обоих XE7 и Delphi 10 Seattle, проект находится здесь:

https://gist.github.com/fabioxgn/aaaddb5aa65db5d17202

Что делает проект просто:

  • Совершение вызова GET с использованием OpenSSL для https://google.com
  • Запускает DataSnap сервер
  • открывает и закрывает одно подключение к этому DataSnap сервера

Несколько моментов:

  • Если не сделать вызов по протоколу HTTPS, все работает отлично
  • Это происходит только с фильтром RSA включена, если удалить фильтр не врезаться

Любые подсказки о том, что делает этот крах? Я пробовал debbuging, но этот код использует много IPPeerFactory, и я не смог найти окончательный код, который запускается.

Редактировать

Я открыл доклад, и они подтвердили это как ошибку: https://quality.embarcadero.com/browse/RSP-12495

+1

«IPPeer» - это уровень абстракции, который Embarcadero использует для скрытия частной копии Indy, поэтому пользователи могут свободно обновлять собственную копию Indy в своих проектах, не нарушая технологии Embarcadero, такие как DataSnap. –

ответ

2

Из того, что Embarcadero R & D команда обнаружила, что проблема в том, что Инди будет завершена до данных. DBXOpenSSL. Когда Indy завершен, он игнорирует указатели на все методы OpenSSL. Когда Data.DBXOpenSSL завершен, он выполняет код, который пытается использовать указатель на функцию, который теперь равен нулю.

Как временная работа, можно избежать ошибки и изменить последовательности инициализации и завершения, сделав блок абстракции Indy первым элементом в предложении uses (IPPeerClient на стороне клиента, IPPeerServer на стороне сервера) проекта.

+0

Спасибо. Я обновил вопрос с помощью ссылки на проблему. –

Смежные вопросы