libpq leaks memory for SSL connections

Started by Timo Sirainenover 4 years ago3 messagesbugs
Jump to latest
#1Timo Sirainen
timo@sirainen.com

I noticed with valgrind how libpq is leaking memory:

at 0x483577F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x5F645C8: CRYPTO_zalloc (in /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1)
by 0x5E94EEF: BIO_meth_new (in /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1)
by 0x65181EB: ??? (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)
by 0x651950C: ??? (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)
by 0x650140F: PQconnectPoll (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)

Debian doesn't have debuginfo packages for libpq, but looking at the code I think it's pretty clear where the bug is:

my_SSL_set_fd() calls my_BIO_s_socket() which allocates memory with BIO_meth_new(), but nothing ever frees it. Note that OpenSSL's BIO_s_socket() returns a const pointer to statically allocated memory.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Timo Sirainen (#1)
Re: libpq leaks memory for SSL connections

Timo Sirainen <timo@sirainen.com> writes:

I noticed with valgrind how libpq is leaking memory:
at 0x483577F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x5F645C8: CRYPTO_zalloc (in /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1)
by 0x5E94EEF: BIO_meth_new (in /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1)
by 0x65181EB: ??? (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)
by 0x651950C: ??? (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)
by 0x650140F: PQconnectPoll (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)

I see no leak here. The struct is allocated once and kept for possible
re-use by future connections. valgrind concurs, saying it's "still
reachable".

regards, tom lane

#3Timo Sirainen
timo@sirainen.com
In reply to: Tom Lane (#2)
Re: libpq leaks memory for SSL connections

On 1. Oct 2021, at 21.46, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Timo Sirainen <timo@sirainen.com> writes:

I noticed with valgrind how libpq is leaking memory:
at 0x483577F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
by 0x5F645C8: CRYPTO_zalloc (in /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1)
by 0x5E94EEF: BIO_meth_new (in /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1)
by 0x65181EB: ??? (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)
by 0x651950C: ??? (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)
by 0x650140F: PQconnectPoll (in /usr/lib/x86_64-linux-gnu/libpq.so.5.11)

I see no leak here. The struct is allocated once and kept for possible
re-use by future connections. valgrind concurs, saying it's "still
reachable".

Oh, right, somehow I missed it didn't allocate new memory every time. And for some reason valgrind tells me it is "definitely lost". It would be nice if there was some PQglobalDeinit() function that could be called to free it to avoid having to add valgrind suppression, but I guess that's more of a feature request.