turboDelphiのindyでTIdSASLCRAMMD5の使用

解決


LBAHOUSE  2008-01-07 22:51:03  No: 29205

turbodelphiのindyのTIdSASLCRAMMD5を以下のソースで利用するとアドレス00000000のエラーが発生します。ソースたどるとfree命令で止まっているようです。
delphi6で同じソースでは問題なく動作するのですが、どなたが原因を知っておられる方おられるでしょうか?

---------------------------------------------

procedure TForm1.Button1Click(Sender: TObject);
var ss,aa :string;
const a = 'aaaaaaa';
begin
  IdSASLCRAMMD51 := TIdSASLCRAMMD5.Create;
  IdUserPassProvider1 := TIdUserPassProvider.Create;
  IdSASLCRAMMD51.UserPassProvider := TIdUserPassProvider.Create;
  IdSASLCRAMMD51.UserPassProvider := IdUserPassProvider1;

  ss := IdSASLCRAMMD51.StartAuthenticate(a);
  showmessage('ss = ' + ss);
end;


HOta  2008-01-08 16:50:41  No: 29206

アドレス00000000のエラーは、オブジェクトがない場合によく発生します。


KHE00221  2008-01-08 19:37:49  No: 29207

BDS2006だと

const付きのTestだと異常終了せず、Const無しのTest2だと異常終了する

D7では両方異常終了しない。

type
    TA = array of Byte;

procedure TEST(const  A: TA);
begin
    MessageBox(0,PChar(A),'',0);
end;

procedure TEST2(A: TA);
begin
    MessageBox(0,PChar(A),'',0);
end;

procedure TForm7.Button2Click(Sender: TObject);
var
    MemoryStream : TMemoryStream;
begin
    MemoryStream := TMemoryStream.Create;
    MemoryStream.Write('ABCDE'#0#0,7);
    Test2(MemoryStream.Memory);
    MemoryStream.Free;
end;

バグなのか?


KHE00221  2008-01-08 20:08:34  No: 29208

var にすると D7 , BDS ともに異常終了するみたい

procedure TEST3(var A: TA);
begin
    MessageBox(0,PChar(A),'',0);
end;

A := MemoryStream.Memory;
Test3(A);


KHE00221  2008-01-08 20:28:54  No: 29209

Indy9がインストールされている状態で

Indy10をLibにコピーして試しただけだけど

なのでこんな感じなのかな?

CopyTIdBytes は IBGlobal.pas に定義されている関数だけど

class function TIdSASLCRAMMD5.BuildKeydMD5Auth(const Password,  Challenge: string): string;

のローカル関数にしても良いとも思うけど

他の所で使っている場合そこでも異常終了しそうだけど

procedure CopyTIdBytes(const ASource: TIdBytes; const ASourceIndex: Integer;
    const VDest: TIdBytes; const ADestIndex: Integer; const ALength: Integer);
var
    I : Integer;
begin
  //if this assert fails, then it indicates an attempted read-past-end-of-buffer.
  Assert(ALength<=Length(aSource));

  //Move(ASource[ASourceIndex], VDest[ADestIndex], ALength);
  for I:=0 to ALength -1 do
  begin
    VDest[ADestIndex] := ASource[ASourceIndex];
  end;

end;

 IdZeroMemory は元々ローカル関数なので他に影響なし

// Zero out a memory zone
procedure IdZeroMemory(const Dest: TIdbytes; Length: Integer);
begin
    CopyTIdBytes(ToBytes(StringOfChar(#0, Length)), 0, Dest , 0, Length);
end;

IdZeroMemory(AKey.Memory, AKey.Size);

で AKey.Memory から Akey.Size 分 Zero にしているだけだから
ここで関数呼ばずに初期化しても良さそうだけど


LBAHOUSE  2008-01-08 22:38:09  No: 29210

私も調べました結論はKHE00221さんと同感でした。

  BuildKeydMD5Auth関数内のローカル関数  IdZeroMemory(メモリの初期化)にAkey.memory(TIdMemoryStream)を入れた時にエラーになります。delphi6だと通りましたが。原因は良くわかりませんが。

  解決法はKHE00221さんの指摘されるとおり、IdZeroMemoryはいらないので、そこをコメントアウトすればエラーは発生しなく、また結果の方もdelphi6での結果と等しいので問題はないと思います。KHE00221さんありがとうございまた。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加