Delphi XE7 / 10西雅图DataSnap最终确定中的OpenSSL访问冲突

时间:2015-10-01 18:33:44

标签: delphi indy delphi-xe7 indy10 delphi-10-seattle

在我们的DataSnap TCP服务器中添加对https网站的调用后,它在最终确定时开始崩溃。

崩溃发生在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

项目的作用很简单:

  • 使用OpenSSL与https://google.com
  • 进行GET通话
  • 启动DataSnap服务器
  • 打开然后关闭与此DataSnap服务器的单个连接

几点:

  • 如果没有拨打https电话,一切正常
  • 仅在启用RSA过滤器时才会发生这种情况,如果我删除它不会崩溃的过滤器

有关导致此次崩溃的原因的任何线索?我尝试了debbuging,但是这段代码使用了很多IPPeerFactory,我无法找到最终运行的代码。

修改

我已打开报告,他们确认这是一个错误:https://quality.embarcadero.com/browse/RSP-12495

1 个答案:

答案 0 :(得分:2)

从Embarcadero R&amp; D团队发现,问题是Indy在Data.DBXOpenSSL之前完成。当Indy最终确定时,它会将函数指针指向所有OpenSSL方法。当Data.DBXOpenSSL完成时,它会执行尝试使用现在为零的函数指针的代码。

作为临时工作,可以通过将Indy抽象单元作为uses子句中的第一个单元(客户端的IPPeerClient,服务器端的IPPeerServer)来避免错误并更改初始化和终止序列。一个项目。