Solved

DCPCrypt thread issues

Posted on 2008-10-30
4
899 Views
Last Modified: 2009-12-16
I have a very simple function in a DLL.  My problem is that the DLL will get an exception every once in a while.  The exception is "Invalid Pointer".  I get this error when I am calling the DLL from 2 different threads.  Is DCPCrypt thread-safe and can I do to insure I am using DCPCrypt correctly.
function SHA1(aInputStr: PChar;
              var aHash: PChar): Integer; stdcall;
var
  tHash      : TDCP_sha1;
  sHash      : string;
  sHex       : string;
  Digest     : array of Byte;
  i          : integer;
 
begin
  if (State <> READY) and (State <> PUST_IN_PROGRESS) then begin
    // Error - DLL is in an invalid state to perform this operation
    Result := 1;
    Exit;
  end;
  try
    tHash  := TDCP_sha1.Create(nil);
    try
      tHash.Init;
      tHash.UpdateStr(StrPas(aInputStr));
      // Generate the Hash
      SetLength(Digest, tHash.HashSize div 8);
      tHash.Final(Digest[0]);
      sHash := '';
      for i := 0 to Length(Digest) - 1 do begin
        sHex := IntToHex(Digest[i], 2);
        sHash := sHash + sHex;
      end;
 
      if (Get_Memory(Pointer(aHash), Length(sHash))) then begin
        // return the CipherText
        StrPCopy(aHash, sHash);
        Result := 0;
      end else begin
        Result := 2;
        LogInfo('SHA1: ', 'Error allocating memory');
      end;
    finally
      tHash.Free;
    end;
  except
    on E: Exception do begin
      State  := SHA1_HASH_EXCEPTION;
      Result := 2;
      LogInfo('SHA1_HASH_EXCEPTION:', E.Message );
    end;
  end;
end;

Open in new window

0
Comment
Question by:rayman3411
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
4 Comments
 
LVL 28

Accepted Solution

by:
2266180 earned 500 total points
ID: 22852506
I don't know about DCPCrypt but if it's not thread safe, you can fix that pretty easily like this:

assuming your funciton is declared like this:

function SHA1(aInputStr: PChar;
              var aHash: PChar): Integer; stdcall; external 'yourdll.dll';

you will make another function named

function sha1_(aInputStr: PChar; var aHash: PChar): Integer; // youc an choose any name you want, this is just an example
begin
  cs.acquire;
  try
    result:=sha1(aInputStr, aHash);
  finally
    cs.release;
  end;
end;

and declare a global variable like:

implementation

uses SyncObjs;

var cs:TCriticalSection;

.. functions here, including sha1_ ...

initialization
  cs:=TCriticalSection.Create;

finalization
  freeandnil(cs);

end.// end of unit

and then replace all your sha1 calls with sha1_
same goes for any other function which uses the same dll
0
 
LVL 45

Expert Comment

by:aikimark
ID: 22855594
ciuly

DCPcrypt - Delphi Cryptography Package (open source / MIT licensed)
http://www.cityinthesky.co.uk/cryptography.html

I haven't found anyone discussing whether it is thread-safe or not.

Is it possible that he needs
   tHash.Free;
in the EXCEPT clause of the (nested) TRY statements?
0
 
LVL 28

Expert Comment

by:2266180
ID: 22857827
>> in the EXCEPT clause of the (nested) TRY statements?

NEVER. trhe except clause executes only on exception. the finally clause executes EVERY time. correct way is
create resource
try
  use resource
finally
  destroy resource
end;

PS: I don't have time to dig in the DCPcrypt source to check.
0

Featured Post

On Demand Webinar: Networking for the Cloud Era

Did you know SD-WANs can improve network connectivity? Check out this webinar to learn how an SD-WAN simplified, one-click tool can help you migrate and manage data in the cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
This article explains how to create forms/units independent of other forms/units object names in a delphi project. Have you ever created a form for user input in a Delphi project and then had the need to have that same form in a other Delphi proj…
There are cases when e.g. an IT administrator wants to have full access and view into selected mailboxes on Exchange server, directly from his own email account in Outlook or Outlook Web Access. This proves useful when for example administrator want…
NetCrunch network monitor is a highly extensive platform for network monitoring and alert generation. In this video you'll see a live demo of NetCrunch with most notable features explained in a walk-through manner. You'll also get to know the philos…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question