Re: Investigating a leak

2005-07-19 Thread Cesc
On 7/19/05, Rich Salz [EMAIL PROTECTED] wrote:
  Doing this now, but since my app is a server, it never really reaches
  the end, and the leaks build up during its lifetime, which I'd rather
  hoped could be more than a day or so. As it is now, the process'
  virtual memory size quickly reaches 3.5 GB, and then malloc() starts
  failing.
 
 Something wrong is happening.  Lots of folks are running apache/openssl
 servers for days, weeks, etc., at a time.
 
 If you're seeing memory leaks like you describe, then it is far more
 likely that the like is either in your code, or there's a bug in the way
 you're calling OpenSSL.  Do you get the same growth when openssl isn't
 used?  Make sure you xxx_free every object you xxx_new.
 
 /r$
 

Hi,

I was looking at the code ... could it be that the memory leak is in
the main server loop?
Sometimes, the ssl_accept may return 0, but with an error code like
SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE, which just means that
could not complete the handshake, but not really an error (just call
ssl_accept again ... ).
But in you main server thread, you just do a continue, thus looping
again ... and creating a brand new ssl structure and socket ... you
should
loop() {
  create the tcp socket
  loop () {
  ssl_accept from the tcp socket till non-zero
   }
}
  
Take a look at the examples that come with openssl.

Regards,

Cesc
__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


RE: Investigating a leak

2005-07-19 Thread Simon Edwards
That'd do it. But if you're doing the loop in that sequence, and if you have
set non-blocking on the sockets, then instead of polling for the connection
you can use select or poll (depending on your platform) to wait for incoming
connection activity, then enter ssl_accept in blocking mode which would
probably cut down on those fake errors. Wouldn't this be a better sequence?

If you are worried about inserting another call in the sequence... Being in
blocking mode at this stage shouldn't adversely affect performance as the
connection thread would only be in a polling loop during this period anyway
in this code example. Being in a time-limited wait during select only aids
performance as it allows the client serving threads access to the time-slice
for the process which would otherwise be tied up in the polling loop. The
new select() call could adversely impact performance if you have to service
a continual stream of new client connections that  prevent the select() from
blocking at all, but that is unlikely in the real world.

Regards,

   Simon

- --
Simon Edwards 



-Original Message-
From: Cesc [mailto:[EMAIL PROTECTED]
Sent: 19 July 2005 09:58
To: openssl-users@openssl.org
Subject: Re: Investigating a leak


On 7/19/05, Rich Salz [EMAIL PROTECTED] wrote:
  Doing this now, but since my app is a server, it never really reaches
  the end, and the leaks build up during its lifetime, which I'd rather
  hoped could be more than a day or so. As it is now, the process'
  virtual memory size quickly reaches 3.5 GB, and then malloc() starts
  failing.
 
 Something wrong is happening.  Lots of folks are running apache/openssl
 servers for days, weeks, etc., at a time.
 
 If you're seeing memory leaks like you describe, then it is far more
 likely that the like is either in your code, or there's a bug in the way
 you're calling OpenSSL.  Do you get the same growth when openssl isn't
 used?  Make sure you xxx_free every object you xxx_new.
 
 /r$
 

Hi,

I was looking at the code ... could it be that the memory leak is in
the main server loop?
Sometimes, the ssl_accept may return 0, but with an error code like
SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE, which just means that
could not complete the handshake, but not really an error (just call
ssl_accept again ... ).
But in you main server thread, you just do a continue, thus looping
again ... and creating a brand new ssl structure and socket ... you
should
loop() {
  create the tcp socket
  loop () {
  ssl_accept from the tcp socket till non-zero
   }
}
  
Take a look at the examples that come with openssl.

Regards,

Cesc
__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


This message has been scanned for viruses by MailController -
www.MailController.altohiway.com
__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


Re: Investigating a leak

2005-07-19 Thread Cesc
Why don't you move the ssl handshake to the thread code? 
Let the main loop accept tcp sockets, then create the thread with the
tcp socket as the argument you pass to the thread run method ...
perform then the ssl_accept loop (blocking or non-blocking, up to you)
in the thread ...

Just a suggestion.

Cesc

On 7/19/05, Simon Edwards [EMAIL PROTECTED] wrote:
 That'd do it. But if you're doing the loop in that sequence, and if you have
 set non-blocking on the sockets, then instead of polling for the connection
 you can use select or poll (depending on your platform) to wait for incoming
 connection activity, then enter ssl_accept in blocking mode which would
 probably cut down on those fake errors. Wouldn't this be a better sequence?
 
 If you are worried about inserting another call in the sequence... Being in
 blocking mode at this stage shouldn't adversely affect performance as the
 connection thread would only be in a polling loop during this period anyway
 in this code example. Being in a time-limited wait during select only aids
 performance as it allows the client serving threads access to the time-slice
 for the process which would otherwise be tied up in the polling loop. The
 new select() call could adversely impact performance if you have to service
 a continual stream of new client connections that  prevent the select() from
 blocking at all, but that is unlikely in the real world.
 
 Regards,
 
Simon
 
 - --
 Simon Edwards
 
 
 
 -Original Message-
 From: Cesc [mailto:[EMAIL PROTECTED]
 Sent: 19 July 2005 09:58
 To: openssl-users@openssl.org
 Subject: Re: Investigating a leak
 
 
 On 7/19/05, Rich Salz [EMAIL PROTECTED] wrote:
   Doing this now, but since my app is a server, it never really reaches
   the end, and the leaks build up during its lifetime, which I'd rather
   hoped could be more than a day or so. As it is now, the process'
   virtual memory size quickly reaches 3.5 GB, and then malloc() starts
   failing.
 
  Something wrong is happening.  Lots of folks are running apache/openssl
  servers for days, weeks, etc., at a time.
 
  If you're seeing memory leaks like you describe, then it is far more
  likely that the like is either in your code, or there's a bug in the way
  you're calling OpenSSL.  Do you get the same growth when openssl isn't
  used?  Make sure you xxx_free every object you xxx_new.
 
  /r$
 
 
 Hi,
 
 I was looking at the code ... could it be that the memory leak is in
 the main server loop?
 Sometimes, the ssl_accept may return 0, but with an error code like
 SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE, which just means that
 could not complete the handshake, but not really an error (just call
 ssl_accept again ... ).
 But in you main server thread, you just do a continue, thus looping
 again ... and creating a brand new ssl structure and socket ... you
 should
 loop() {
   create the tcp socket
   loop () {
   ssl_accept from the tcp socket till non-zero
}
 }
 
 Take a look at the examples that come with openssl.
 
 Regards,
 
 Cesc
 __
 OpenSSL Project http://www.openssl.org
 User Support Mailing Listopenssl-users@openssl.org
 Automated List Manager   [EMAIL PROTECTED]
 
 
 This message has been scanned for viruses by MailController -
 www.MailController.altohiway.com
 __
 OpenSSL Project http://www.openssl.org
 User Support Mailing Listopenssl-users@openssl.org
 Automated List Manager   [EMAIL PROTECTED]

__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


RE: Investigating a leak

2005-07-19 Thread David Schwartz

 That'd do it. But if you're doing the loop in that sequence, and
 if you have
 set non-blocking on the sockets, then instead of polling for the
 connection
 you can use select or poll (depending on your platform) to wait
 for incoming
 connection activity, then enter ssl_accept in blocking mode which would
 probably cut down on those fake errors. Wouldn't this be a better
 sequence?

Eww, no. Suppose the connection is aborted before you manage to call
SSL_accept. The call could block indefinitely. It is almost always a mistake
to use 'select' or 'poll' with blocking socket operations.

DS


__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


Re: Investigating a leak

2005-07-18 Thread Amar Desai

http://www.openssl.org/support/faq.html

Search for the words *memory leak*

-Amar.

Axel Andersson wrote:


Hello,

I'm investigating a leak in a server application, which I've managed  
to reduce to a test case which involves OpenSSL and threads. I've put  
the code up at http://www.zankasoftware.com/ssltest/server.c if  
anyone would be willing to take a look and see what I'm doing wrong.


Every time I connect to this test with openssl s_client, it leaks  
some 516 KB virtual memory, which is never reclaimed. If pthread_join 
() is inserted after pthread_create(), no leaks occur. It does not  
matter if I move all the SSL calls to the reply thread, or leave the  
SSL_accept() call in the main thread where it is now.


I'm testing this on Mac OS X with its default OpenSSL 0.9.7b. I also  
downloaded and built the recent 0.9.8 release and was able to  
reproduce the problem with that.


Thanks in advance,

-- Axel


__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]



smime.p7s
Description: S/MIME Cryptographic Signature


Re: Investigating a leak

2005-07-18 Thread Axel Andersson

On Jul 18, 2005, at 14:11, Amar Desai wrote:


http://www.openssl.org/support/faq.html

Search for the words *memory leak*


Yes, thank you, indeed I have read that, and I am using  
ERR_remove_state() at the end of the thread. Looks to me like the  
other functions should be used before terminating the application,  
not for per-thread cleanup, or did I misunderstand something?


-- Axel

__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


Re: Investigating a leak

2005-07-18 Thread Amar Desai

Yes, You need to call other functions as well.

-Amar

Axel Andersson wrote:

Yes, thank you, indeed I have read that, and I am using  
ERR_remove_state() at the end of the thread. Looks to me like the  
other functions should be used before terminating the application,  
not for per-thread cleanup, or did I misunderstand something?


-- Axel

__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]



smime.p7s
Description: S/MIME Cryptographic Signature


RE: Investigating a leak

2005-07-18 Thread Simon Edwards
Hi Axel,

I don't know if it helps you much, but since the FAQ is a bit cryptic it may
help. I've used...

ERR_remove_state() 

...at the end of each thread.

Plus...

CRYPTO_cleanup_all_ex_data()
CONF_modules_free()
ERR_free_strings()
EVP_cleanup()

... at the end of the application.

I have no leaks that I can detect when using 0.9.7g.

At the time I wrote my code I couldn't find any FAQ entry that worked along
the lines of if you use function  or function group , then you must
call  to free underlying data. My app' isn't loading external engines
or doing anything fancy, so these are probably not a comprehensive list of
resource releasing functions.

Regards,

   Simon

- --
Simon Edwards 

-Original Message-
From: Amar Desai [mailto:[EMAIL PROTECTED]
Sent: 18 July 2005 16:59
To: openssl-users@openssl.org
Subject: Re: Investigating a leak


Yes, You need to call other functions as well.

-Amar

Axel Andersson wrote:

 Yes, thank you, indeed I have read that, and I am using  
 ERR_remove_state() at the end of the thread. Looks to me like the  
 other functions should be used before terminating the application,  
 not for per-thread cleanup, or did I misunderstand something?

 -- Axel

 __
 OpenSSL Project http://www.openssl.org
 User Support Mailing Listopenssl-users@openssl.org
 Automated List Manager   [EMAIL PROTECTED]

__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


Re: Investigating a leak

2005-07-18 Thread Axel Andersson

On Jul 18, 2005, at 18:57, Simon Edwards wrote:

I don't know if it helps you much, but since the FAQ is a bit  
cryptic it may

help. I've used...

ERR_remove_state()

...at the end of each thread.



Doing this.


Plus...

CRYPTO_cleanup_all_ex_data()
CONF_modules_free()
ERR_free_strings()
EVP_cleanup()

... at the end of the application.



Doing this now, but since my app is a server, it never really reaches  
the end, and the leaks build up during its lifetime, which I'd rather  
hoped could be more than a day or so. As it is now, the process'  
virtual memory size quickly reaches 3.5 GB, and then malloc() starts  
failing.


Well, thanks for your help anyway, I appreciate it.

-- Axel


__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


Re: Investigating a leak

2005-07-18 Thread Rich Salz
 Doing this now, but since my app is a server, it never really reaches
 the end, and the leaks build up during its lifetime, which I'd rather
 hoped could be more than a day or so. As it is now, the process'
 virtual memory size quickly reaches 3.5 GB, and then malloc() starts
 failing.

Something wrong is happening.  Lots of folks are running apache/openssl
servers for days, weeks, etc., at a time.

If you're seeing memory leaks like you describe, then it is far more
likely that the like is either in your code, or there's a bug in the way
you're calling OpenSSL.  Do you get the same growth when openssl isn't
used?  Make sure you xxx_free every object you xxx_new.

/r$

-- 
Rich Salz  Chief Security Architect
DataPower Technology   http://www.datapower.com
XS40 XML Security Gateway  http://www.datapower.com/products/xs40.html

__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]