I am using Axis2c 1.6 and OpenSSL (first 0.9.8l, now 0.9.8o) on Windows Server 2008 R2; I have MS Visual Studio 2008 installed, but build using nmake instead of the solution under the ides folder.

The only settings of note in configure.in are ENABLE_SSL = 1 and CRUNTIME = /MD. I staticly link with the Openssl library.

I am seeing the following leak reported after sending a request:

 MSVCR90D: malloc
axis2_http_sender: default_malloc_ex: \openssl\openssl-0.9.8o\crypto\mem.c line 79 axis2_http_sender: CRYPTO_malloc: \openssl\openssl-0.9.8o\crypto\mem.c line 328
 axis2_http_sender: SSL_new: \openssl\openssl-0.9.8o\ssl\ssl_lib.c line 258
axis2_http_sender: axis2_ssl_utils_initialize_ssl: \axis2c\axis2c-1.6.0\src\core\transport\http\sender\ssl\ssl_utils.c line 134 axis2_http_sender: axutil_stream_create_ssl: \axis2c\axis2c-1.6.0\src\core\transport\http\sender\ssl\ssl_stream.c line 106 axis2_http_sender: axis2_http_client_send: \axis2c\axis2c-1.6.0\src\core\transport\http\sender\http_client.c line 268 axis2_http_sender: axis2_http_sender_send: \axis2c\axis2c-1.6.0\src\core\transport\http\sender\http_sender.c line 1103 axis2_http_sender: axis2_http_transport_sender_write_message: \axis2c\axis2c-1.6.0\src\core\transport\http\sender\http_transport_sender.c line 808 axis2_http_sender: axis2_http_transport_sender_invoke: \axis2c\axis2c-1.6.0\src\core\transport\http\sender\http_transport_sender.c line 312 axis2_engine: axis2_op_client_two_way_send: \axis2c\axis2c-1.6.0\src\core\clientapi\op_client.c line 1172 axis2_engine: axis2_op_client_worker_func: \axis2c\axis2c-1.6.0\src\core\clientapi\op_client.c line 696
 ntdll: RtlInitializeExceptionChain_x002B_54_bytes__0x776C9D45

It's actually 2 leaks. The first happens because axis2_http_client_send() allocates a stream of type ssl: http_client.c 266 client->data_stream = axutil_stream_create_ssl(env, client->sockfd, axis2_http_client_get_server_cert(client, env), axis2_http_client_get_key_file(client, env), ssl_pp);

but the 'destructor' set in axis2_http_sender_process_response() is for the unmanaged stream types:
   http_sender.c 1617  property = axutil_property_create (env);
axutil_property_set_scope (property, env, AXIS2_SCOPE_REQUEST); axutil_property_set_free_func (property, env, axutil_stream_free_void_arg);

I have been able to fix that leak by replacing the last line above with
#ifdef AXIS2_SSL_ENABLED
 if (in_stream->stream_type == AXIS2_STREAM_SOCKET)
axutil_property_set_free_func (property, env, axutil_stream_free_void_arg);
 else // ssl streams are AXIS2_STREAM_BASIC
  axutil_property_set_free_func (property, env, axis2_ssl_stream_free);
#else
axutil_property_set_free_func (property, env, axutil_stream_free_void_arg);
#endif

and adding a forward declare
// expose private function is sender\ssl\ssl_stream.c
#ifdef AXIS2_SSL_ENABLED
 void AXIS2_CALL axis2_ssl_stream_free(
  axutil_stream_t * stream,
  const axutil_env_t * env);
#endif

The second leak is from the allocation at ssl_lib.c, line 258, reported above. It can be fixed in axis2_ssl_utils_cleanup_ssl() in ssl_utils.c, line 217

   if (ssl)
   {
       SSL_shutdown(ssl);
       // fix memory leak
       OPENSSL_free(ssl);
   }

Do you think these look like a safe fixes?

Regards,
Steve




---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to