jumaris / indyproject

Automatically exported from code.google.com/p/indyproject
0 stars 0 forks source link

Memory leak in OpenSSL #204

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
Within OpenSSL, error queue data structures are allocated automatically for new 
threads and must be freed when the thread terminates.
Currently, TIdServerIOHandlerSSLOpenSSL does not handle this.  Modifying 
TIdSSLSocket.Destroy() removed the leaks:

destructor TIdSSLSocket.Destroy;
begin
  if fSSL <> nil then begin
    //SSL_set_shutdown(fSSL, SSL_SENT_SHUTDOWN);
    SSL_shutdown(fSSL);
    SSL_free(fSSL);
    fSSL := nil;
  end;
  FreeAndNil(fSSLCipher);
  FreeAndNil(fPeerCert);
  ERR_remove_thread_state(0); <---- Add this line
  inherited Destroy;
end;

However, TIdSSLSocket is not tied to any particular thread, so its destructor 
is not the best place to call ERR_remove_thread_state().  A better approach is 
to hook into the threads that are managed by the TIdSchedulerOfThread... 
components directly and do the cleanup during thread shutdowns.  Derive a new 
class from TIdThreadWithTaskClass, override its virtual AfterExecute() method 
to call ERR_remove_thread_state(), assign the desired TIdSchedulerOfThread... 
component to the TIdTCPServer.Scheduler property, and assign the custom class 
type to the TIdSchedulerOfThread.ThreadClass property.

Need to figure out a way to make this more automated.

Original issue reported on code.google.com by gambit47 on 4 Nov 2011 at 4:55