|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

Reply via email to