2

在我们的 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

该项目所做的很简单:

几点:

  • 如果不进行 https 调用,一切正常
  • 这只发生在启用 RSA 过滤器的情况下,如果我删除过滤器它不会崩溃

关于是什么导致这次崩溃的任何线索?我尝试调试,但这段代码使用了很多 IPPeerFactory,我找不到运行的最终代码。

编辑

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

4

1 回答 1

2

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

作为临时解决方法,可以通过将 Indy 抽象单元作为项目的 uses 子句(客户端 IPPeerClient,服务器端 IPPeerServer)中的第一个单元来避免错误并更改初始化和完成顺序.

于 2015-12-11T11:21:02.167 回答