[ https://issues.apache.org/jira/browse/AXIS2C-1586?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Bill Blough updated AXIS2C-1586: -------------------------------- Labels: patch (was: ) > Memory leak in axis2_http_worker_process_request (http_worker.c) > ---------------------------------------------------------------- > > Key: AXIS2C-1586 > URL: https://issues.apache.org/jira/browse/AXIS2C-1586 > Project: Axis2-C > Issue Type: Bug > Components: core/transport > Affects Versions: 1.6.0, 1.7.0, Current (Nightly) > Environment: Solaris 10 > Reporter: Serghei Samsi > Priority: Major > Labels: patch > Attachments: axis2-c-http_worker-out_stream.diff > > > If trying to connect to HTTP based service (axis2_http_server) by using > telnet and simply exiting, appears memory leak which grows after each connect. > How to reproduce: > Try many times > # telnet <AXIS_IP> <AXIS_PORT> > ^C > Solaris MBD output (axis2_http_server binary was started with the following > environment: LD_PRELOAD=libumem.so.1 UMEM_DEBUG=default): > umem_alloc_2304 leak: 1 buffer, 2304 bytes > ADDR BUFADDR TIMESTAMP THREAD > CACHE LASTLOG CONTENTS > 810f380 8111c00 34aa8a030e830 2 > 80b3590 0 0 > libumem.so.1`umem_cache_alloc_debug+0x16c > libumem.so.1`umem_cache_alloc+0x15c > libumem.so.1`umem_alloc+0x3f > libumem.so.1`malloc+0x23 > libaxutil.so.0.6.0`axutil_allocator_malloc_impl+0x1b > libaxutil.so.0.6.0`axutil_stream_create_basic+0x57 > > libaxis2_http_common.so.0.6.0`axis2_http_worker_process_request > +0x20 > > libaxis2_http_receiver.so.0.6.0`axis2_svr_thread_worker_func+0x > 8c > libaxutil.so.0.6.0`dummy_worker+0x10 > libc.so.1`_thr_setup+0x4e > libc.so.1`_lwp_start > umem_alloc_56 leak: 1 buffer, 56 bytes > ADDR BUFADDR TIMESTAMP THREAD > CACHE LASTLOG CONTENTS > 817a630 81799e8 34aa8a030d2fd 2 > 80a3010 0 0 > libumem.so.1`umem_cache_alloc_debug+0x16c > libumem.so.1`umem_cache_alloc+0x15c > libumem.so.1`umem_alloc+0x3f > libumem.so.1`malloc+0x23 > libaxutil.so.0.6.0`axutil_allocator_malloc_impl+0x1b > libaxutil.so.0.6.0`axutil_stream_create_internal+0x1e > libaxutil.so.0.6.0`axutil_stream_create_basic+0x1e > > libaxis2_http_common.so.0.6.0`axis2_http_worker_process_request > +0x20 > > libaxis2_http_receiver.so.0.6.0`axis2_svr_thread_worker_func+0x > 8c > libaxutil.so.0.6.0`dummy_worker+0x10 > libc.so.1`_thr_setup+0x4e > libc.so.1`_lwp_start > The problems is in leaked out_stream: > <code> > AXIS2_EXTERN axis2_bool_t AXIS2_CALL > axis2_http_worker_process_request( > ... > axutil_stream_t *out_stream = axutil_stream_create_basic(env); > ... > axis2_msg_ctx_set_transport_out_stream(msg_ctx, env, out_stream); > ... > return ...; > <code> > Comments on axis2_msg_ctx_set_transport_out_stream says that - citated "Here > out_stream is set into the in message context". > But is msg_cts is null, out_stream will never be freed. The basic idea is > that stream should be created ONLY if msg_ctx does exist. > So the trivial patch which fixes mentioned problem: > *** axis2c-src-1.6.0-orig/src/core/transport/http/common/http_worker.c Mon > Apr 6 07:46:47 2009 > --- axis2c-src-1.6.0/src/core/transport/http/common/http_worker.c Fri > Feb 3 14:07:33 2012 > *************** > *** 115,121 **** > axutil_stream_t *request_body = NULL; > /* Creating out_stream as basic stream */ > ! axutil_stream_t *out_stream = axutil_stream_create_basic(env); > axis2_http_simple_response_t *response = NULL; > /* Transport in and out descriptions */ > --- 115,121 ---- > axutil_stream_t *request_body = NULL; > /* Creating out_stream as basic stream */ > ! axutil_stream_t *out_stream = NULL; > axis2_http_simple_response_t *response = NULL; > /* Transport in and out descriptions */ > *************** > *** 474,480 **** > * To avoid double freeing of out_stream we reset the out message > context at the end of engine > * receive function. > */ > ! axis2_msg_ctx_set_transport_out_stream(msg_ctx, env, out_stream); > headers = axis2_http_worker_get_headers(http_worker, env, > simple_request); > axis2_msg_ctx_set_transport_headers(msg_ctx, env, headers); > --- 474,484 ---- > * To avoid double freeing of out_stream we reset the out message > context at the end of engine > * receive function. > */ > ! if (msg_ctx) > ! { > ! out_stream = axutil_stream_create_basic(env); > ! axis2_msg_ctx_set_transport_out_stream(msg_ctx, env, out_stream); > ! } > headers = axis2_http_worker_get_headers(http_worker, env, > simple_request); > axis2_msg_ctx_set_transport_headers(msg_ctx, env, headers); -- This message was sent by Atlassian JIRA (v7.6.14#76016) --------------------------------------------------------------------- To unsubscribe, e-mail: c-dev-unsubscr...@axis.apache.org For additional commands, e-mail: c-dev-h...@axis.apache.org