[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
SSL/TLS memory leak in multithread mode. more detail about ITS#6018
--000e0cd291e2f684b60464fb3237
Content-Type: multipart/alternative; boundary=000e0cd291e2f6849e0464fb3235
--000e0cd291e2f6849e0464fb3235
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
The program is a daemon which will create a thread to query LDAP server for
every request.
a part of code of socket loop:
newfd = accept(listen_fd, &cliaddr, &clilen);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&instance_thread, &attr, queryldap, (void *)newfd);
a part of code of querying LDAP server:
int queryldap()
{
timeout = 10
ldap_set_option( NULL, LDAP_OPT_NETWORK_TIMEOUT, &timeout );
if SSL
ldap_initialize(&ld, "ldaps://...");
else
ldap_initialize(&ld, "ldap://...");
protocol = 3;
rc = 0;
if SSL or TLS
ldap_set_option( ld, LDAP_OPT_PROTOCOL_VERSION, &protocol );
ldap_set_option( NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, &rc );
if TLS
ldap_start_tls_s( ld, NULL, NULL );
ldap_bind_s(ld, bindDN, bindPasswd, LDAP_AUTH_SIMPLE);
...
ldap_unbind_s(ld);
}
I cannot use ldap_pvt_tls_destroy(), because this function can call only
once.
If I don't create different thread for every request (one thread for all
request), there is no any memory leak. So, I think this case is related to
the multithread mode.
Maybe, there are some memory that don't be freed after the querying thread
finished.
In addtion, there is no any memory leak when I use unencryption mode.
The attachment is the snippet of memory image which is likely the leak part.
The memory leak produced by one thread seems to be about 352 bytes.
--000e0cd291e2f6849e0464fb3235
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
The program is a daemon which will create a thread to query LDAP server for=
every request. <br><br>a part of code of socket loop:<br>newfd =3D accept(=
listen_fd, &cliaddr, &clilen);<br>pthread_attr_setdetachstate(&=
attr, PTHREAD_CREATE_DETACHED);<br>
pthread_create(&instance_thread, &attr, queryldap, (void *)newfd);<=
br><br>a part of code of querying LDAP server:<br>int queryldap()<br>{<br>=
=A0=A0=A0 timeout =3D 10<br>=A0=A0=A0 ldap_set_option( NULL, LDAP_OPT_NETWO=
RK_TIMEOUT, &timeout );<br>
<br>=A0=A0=A0 if SSL<br>=A0 =A0=A0 =A0=A0 ldap_initialize(&ld, "ld=
aps://...");<br>=A0=A0=A0 else<br>=A0=A0=A0=A0=A0=A0=A0 ldap_initializ=
e(&ld, "ldap://...");<br><br>=A0=A0=A0 protocol =3D 3;<br>=A0=
=A0=A0 rc =3D 0;<br>=A0=A0=A0 if SSL or TLS<br>=A0=A0=A0=A0=A0=A0=A0 ldap_s=
et_option( ld, LDAP_OPT_PROTOCOL_VERSION, &protocol );<br>
=A0 =A0=A0 =A0=A0 ldap_set_option( NULL, LDAP_OPT_X_TLS_REQUIRE_CERT, &=
rc );<br><br>=A0=A0=A0 if TLS<br>=A0=A0=A0=A0=A0=A0=A0 ldap_start_tls_s( ld=
, NULL, NULL );<br><br>=A0=A0=A0 ldap_bind_s(ld,=A0 bindDN, bindPasswd, LDA=
P_AUTH_SIMPLE);<br>=A0=A0=A0 ...<br><br>
=A0=A0=A0 ldap_unbind_s(ld);<br>}<br><br>I cannot use ldap_pvt_tls_destroy(=
), because this function can call only once.<br><br>If I don't create d=
ifferent thread for every request (one thread for all request), there is no=
any memory leak. So, I think this case is related to the multithread mode.=
<br>
Maybe, there are some memory that don't be freed after the querying thr=
ead finished.<br>In addtion, there is no any memory leak when I use unencry=
ption mode.<br><br>The attachment is the snippet of memory image which is l=
ikely the leak part. The memory leak produced by one thread seems to be abo=
ut 352 bytes.<br>
<br><br><br>
--000e0cd291e2f6849e0464fb3235--
--000e0cd291e2f684b60464fb3237
Content-Type: application/octet-stream; name=memory-leak-snippet
Content-Disposition: attachment; filename=memory-leak-snippet
Content-Transfer-Encoding: base64
X-Attachment-Id: f_fs8k4pwa0
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////
////////////////////////////////////////////////////////////////////AAAAAAAA
AAARAAAAiDkRCGAMGgh0kgAAUQEAAEkLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////
////////////////////////////////////////////////////////////////////////////
/////wAAAAAAAAAAEQAAAOg6EQjADRoItZIAAFEBAABOCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAP//////////////////////////////////////////////////////////////////
//////////////////8AAAAAAAAAABEAAABIPBEIIA8aCPaSAABRAQAAUwsAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////
////////////////////////////////AAAAAAAAAAARAAAAqD0RCIAQGgg3kwAAUQEAAFgLAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////
/////////////////////////////////////////////wAAAAAAAAAAEQAAAAg/EQjgERoIeJMA
AFEBAABdCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAA=
--000e0cd291e2f684b60464fb3237--