|Hi, While testing PostgreSQL with LeakSanitizer enabled, I found a
memory leak in pg_config. The issue can be reproduced by running:
pg_config --version LeakSanitizer reports 2829 bytes leaked in 47
allocations. The full report is attached as leak_sanitizer.txt. The
relevant allocation stack is: libc.so.6!__GI___libc_malloc(size_t bytes)
(malloc.c:3288) pg_malloc_internal(size_t size, int flags)
(src/common/fe_memutils.c:36) palloc(Size size)
(src/common/fe_memutils.c:123) palloc_mul(Size s1, Size s2)
(src/common/fe_memutils.c:312) get_configdata(const char *my_exec_path,
size_t *configdata_len) (src/common/config_info.c:42) main(int argc,
char **argv) (src/bin/pg_config/pg_config.c:157) Although
get_configdata() uses palloc_array() and pstrdup(), pg_config is a
frontend program. The frontend implementations of palloc() and pstrdup()
ultimately allocate memory using malloc() and strdup(), through
pg_malloc_internal() and pg_strdup(), respectively. These allocations
are not owned by a backend memory context and therefore remain allocated
until they are explicitly freed or the process exits. get_configdata()
allocates the ConfigData array with palloc_array() and allocates its
name and setting strings with pstrdup(). pg_config does not release
these allocations before exiting. This leak is harmless for a
short-lived process, since the operating system releases the memory at
process termination. However, it causes LeakSanitizer failures and adds
noise to sanitizer-based testing. The attached patch adds a helper that
frees every name and setting string and then frees the ConfigData array.
The helper is called on every exit path reached after get_configdata().
After applying the patch, pg_config --version completes without a
LeakSanitizer report. The patch is attached as:
v1-0001-Fix-memory-leak-in-pg_config.patch |
--
Best wishes,
Ivan Kush
Tantor Labs LLC
=================================================================
==611824==ERROR: LeakSanitizer: detected memory leaks
Direct leak of 368 byte(s) in 1 object(s) allocated from:
#0 0x556274ec32bf in __interceptor_malloc
../../../../src/libsanitizer/asan/asan_malloc_linux.cpp:69
#1 0x556274f13e53 in pg_malloc_internal /build/src/common/fe_memutils.c:36
#2 0x556274f1427e in palloc /build/src/common/fe_memutils.c:123
#3 0x556274f150f1 in palloc_mul /build/src/common/fe_memutils.c:312
#4 0x556274f0c47a in get_configdata /build/src/common/config_info.c:42
#5 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#6 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 940 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0ddd7 in get_configdata /build/src/common/config_info.c:127
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 395 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e290 in get_configdata /build/src/common/config_info.c:148
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 178 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e5b6 in get_configdata /build/src/common/config_info.c:164
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 153 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e0fd in get_configdata /build/src/common/config_info.c:140
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 112 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0ea6f in get_configdata /build/src/common/config_info.c:188
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 60 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0dc44 in get_configdata /build/src/common/config_info.c:123
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 44 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0cf6f in get_configdata /build/src/common/config_info.c:80
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 39 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0c9fc in get_configdata /build/src/common/config_info.c:62
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 39 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0c82b in get_configdata /build/src/common/config_info.c:56
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 37 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0cd9e in get_configdata /build/src/common/config_info.c:74
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 35 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d884 in get_configdata /build/src/common/config_info.c:110
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 33 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d311 in get_configdata /build/src/common/config_info.c:92
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 33 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0da55 in get_configdata /build/src/common/config_info.c:116
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 31 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d4e2 in get_configdata /build/src/common/config_info.c:98
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 28 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d6b3 in get_configdata /build/src/common/config_info.c:104
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 26 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0cbcd in get_configdata /build/src/common/config_info.c:68
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 22 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0c65a in get_configdata /build/src/common/config_info.c:50
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 22 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d140 in get_configdata /build/src/common/config_info.c:86
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 18 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0ce88 in get_configdata /build/src/common/config_info.c:77
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 16 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0ec02 in get_configdata /build/src/common/config_info.c:195
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 14 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0ccb7 in get_configdata /build/src/common/config_info.c:71
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 11 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e828 in get_configdata /build/src/common/config_info.c:178
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 11 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d96e in get_configdata /build/src/common/config_info.c:113
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 11 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e695 in get_configdata /build/src/common/config_info.c:170
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 11 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0cae6 in get_configdata /build/src/common/config_info.c:65
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 10 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d22a in get_configdata /build/src/common/config_info.c:89
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 10 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0dd23 in get_configdata /build/src/common/config_info.c:126
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 10 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d3fb in get_configdata /build/src/common/config_info.c:95
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 10 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e36f in get_configdata /build/src/common/config_info.c:154
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 9 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d79d in get_configdata /build/src/common/config_info.c:107
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 9 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e049 in get_configdata /build/src/common/config_info.c:138
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 8 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0eb4e in get_configdata /build/src/common/config_info.c:194
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 8 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0c915 in get_configdata /build/src/common/config_info.c:59
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 8 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e502 in get_configdata /build/src/common/config_info.c:162
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 7 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0c4ea in get_configdata /build/src/common/config_info.c:44
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 7 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d059 in get_configdata /build/src/common/config_info.c:83
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 7 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0d5cc in get_configdata /build/src/common/config_info.c:101
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 7 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e1dc in get_configdata /build/src/common/config_info.c:146
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 7 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0c744 in get_configdata /build/src/common/config_info.c:53
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 6 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e423 in get_configdata /build/src/common/config_info.c:156
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 5 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0db3f in get_configdata /build/src/common/config_info.c:119
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 5 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e9bb in get_configdata /build/src/common/config_info.c:186
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 4 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0df6a in get_configdata /build/src/common/config_info.c:132
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 3 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0deb6 in get_configdata /build/src/common/config_info.c:130
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 1 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e8dc in get_configdata /build/src/common/config_info.c:180
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
Indirect leak of 1 byte(s) in 1 object(s) allocated from:
#0 0x556274e7b0ab in __interceptor_strdup
../../../../src/libsanitizer/asan/asan_interceptors.cpp:439
#1 0x556274f141d9 in pg_strdup /build/src/common/fe_memutils.c:101
#2 0x556274f142f4 in pstrdup /build/src/common/fe_memutils.c:147
#3 0x556274f0e749 in get_configdata /build/src/common/config_info.c:172
#4 0x556274f0b984 in main /build/src/bin/pg_config/pg_config.c:157
#5 0x7ce486b87249 in __libc_start_call_main
../sysdeps/nptl/libc_start_call_main.h:58
SUMMARY: AddressSanitizer: 2829 byte(s) leaked in 47 allocation(s).
root@d9e2ae7524d9:/build#
From fcfb081954801183f4c67cfe447c73f22b2dbf9b Mon Sep 17 00:00:00 2001
From: Ivan Kush <[email protected]>
Date: Tue, 21 Jul 2026 15:25:38 +0000
Subject: [PATCH] Fix memory leak in pg_config
---
src/bin/pg_config/pg_config.c | 15 ++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/src/bin/pg_config/pg_config.c b/src/bin/pg_config/pg_config.c
index 28db024263..af99ae8657 100644
--- a/src/bin/pg_config/pg_config.c
+++ b/src/bin/pg_config/pg_config.c
@@ -125,6 +125,17 @@ show_item(const char *configname,
}
}
+static
+void pfree_configdata(ConfigData *configdata, size_t configdata_len)
+{
+ for (size_t i = 0; i < configdata_len; i++)
+ {
+ pfree(configdata[i].name);
+ pfree(configdata[i].setting);
+ }
+ pfree(configdata);
+}
+
int
main(int argc, char **argv)
{
@@ -160,6 +171,7 @@ main(int argc, char **argv)
{
for (i = 0; i < configdata_len; i++)
printf("%s = %s\n", configdata[i].name, configdata[i].setting);
+ pfree_configdata(configdata, configdata_len);
exit(0);
}
@@ -180,9 +192,12 @@ main(int argc, char **argv)
fprintf(stderr, _("%s: invalid argument: %s\n"),
progname, argv[i]);
advice();
+ pfree_configdata(configdata, configdata_len);
exit(1);
}
}
+ pfree_configdata(configdata, configdata_len);
+
return 0;
}
--
2.39.2