From 319119943f018d4725a507f4e389bcf41b5317f3 Mon Sep 17 00:00:00 2001 From: eaglegai Date: Mon, 6 Mar 2023 22:04:06 +0800 Subject: [PATCH 1/3] fix potential memory leak in unbound-host when errors happen ==3709953== HEAP SUMMARY: ==3709953== in use at exit: 276,541 bytes in 23 blocks ==3709953== total heap usage: 29 allocs, 6 frees, 280,682 bytes allocated ==3709953== ==3709953== 1 bytes in 1 blocks are still reachable in loss record 1 of 23 ==3709953== at 0x4866EC0: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-arm64-linux.so) ==3709953== by 0x48E2BC3: ub_initstate (random.c:85) ==3709953== by 0x489B067: ub_ctx_create_nopipe (libunbound.c:114) ==3709953== by 0x489B31F: ub_ctx_create (libunbound.c:180) ==3709953== by 0x10E203: main (unbound-host.c:433) ==3709953== ...... ==3709953== 8,192 bytes in 1 blocks are still reachable in loss record 22 of 23 ==3709953== at 0x4866EC0: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-arm64-linux.so) ==3709953== by 0x48E427B: regional_create_custom (regional.c:94) ==3709953== by 0x48DEA03: edns_strings_create (edns.c:57) ==3709953== by 0x489B0F3: ub_ctx_create_nopipe (libunbound.c:157) ==3709953== by 0x489B31F: ub_ctx_create (libunbound.c:180) ==3709953== by 0x10E203: main (unbound-host.c:433) ==3709953== ==3709953== 262,144 bytes in 1 blocks are still reachable in loss record 23 of 23 ==3709953== at 0x486933C: calloc (in /usr/lib64/valgrind/vgpreload_memcheck-arm64-linux.so) ==3709953== by 0x48C826F: config_create (config_file.c:179) ==3709953== by 0x48C85AF: config_create_forlib (config_file.c:383) ==3709953== by 0x489B0BB: ub_ctx_create_nopipe (libunbound.c:130) ==3709953== by 0x489B31F: ub_ctx_create (libunbound.c:180) ==3709953== by 0x10E203: main (unbound-host.c:433) ==3709953== ==3709953== LEAK SUMMARY: ==3709953== definitely lost: 0 bytes in 0 blocks ==3709953== indirectly lost: 0 bytes in 0 blocks ==3709953== possibly lost: 0 bytes in 0 blocks ==3709953== still reachable: 276,541 bytes in 23 blocks ==3709953== suppressed: 0 bytes in 0 blocks ==3709953== ==3709953== For lists of detected and suppressed errors, rerun with: -s ==3709953== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) Signed-off-by: eaglegai --- smallapp/unbound-host.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/smallapp/unbound-host.c b/smallapp/unbound-host.c index d612575f3..8bffe46ce 100644 --- a/smallapp/unbound-host.c +++ b/smallapp/unbound-host.c @@ -482,6 +482,7 @@ int main(int argc, char* argv[]) case '?': case 'h': default: + ub_ctx_delete(ctx); usage(); } } @@ -495,8 +496,10 @@ int main(int argc, char* argv[]) } argc -= optind; argv += optind; - if(argc != 1) + if(argc != 1) { + ub_ctx_delete(ctx); usage(); + } #ifdef HAVE_SSL #ifdef HAVE_ERR_LOAD_CRYPTO_STRINGS From 184248eb0e0f1e95a1c0c19d22289238c127bcf3 Mon Sep 17 00:00:00 2001 From: eaglegai Date: Tue, 7 Mar 2023 21:49:54 +0800 Subject: [PATCH 2/3] fix memory leak in unbound-streamtcp when open_svr failed ==1927474== Memcheck, a memory error detector ==1927474== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al. ==1927474== Using Valgrind-3.16.0 and LibVEX; rerun with -h for copyright info ==1927474== Command: unbound-streamtcp -f localhost ==1927474== fatal: bad server specs 'localhost' ==1927474== ==1927474== HEAP SUMMARY: ==1927474== in use at exit: 131,186 bytes in 4 blocks ==1927474== total heap usage: 5 allocs, 1 frees, 132,210 bytes allocated ==1927474== ==1927474== 40 bytes in 1 blocks are still reachable in loss record 1 of 4 ==1927474== at 0x483F751: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==1927474== by 0x1E0573: sldns_buffer_new (sbuffer.c:21) ==1927474== by 0x11ECED: send_em (streamtcp.c:374) ==1927474== by 0x11E6C1: main (streamtcp.c:585) ==1927474== ==1927474== 40 bytes in 1 blocks are still reachable in loss record 2 of 4 ==1927474== at 0x483F751: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==1927474== by 0x1E0573: sldns_buffer_new (sbuffer.c:21) ==1927474== by 0x11ECFA: send_em (streamtcp.c:375) ==1927474== by 0x11E6C1: main (streamtcp.c:585) ==1927474== ==1927474== 65,553 bytes in 1 blocks are still reachable in loss record 3 of 4 ==1927474== at 0x483F751: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==1927474== by 0x1E0583: sldns_buffer_new (sbuffer.c:27) ==1927474== by 0x11ECED: send_em (streamtcp.c:374) ==1927474== by 0x11E6C1: main (streamtcp.c:585) ==1927474== ==1927474== 65,553 bytes in 1 blocks are still reachable in loss record 4 of 4 ==1927474== at 0x483F751: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so) ==1927474== by 0x1E0583: sldns_buffer_new (sbuffer.c:27) ==1927474== by 0x11ECFA: send_em (streamtcp.c:375) ==1927474== by 0x11E6C1: main (streamtcp.c:585) ==1927474== ==1927474== LEAK SUMMARY: ==1927474== definitely lost: 0 bytes in 0 blocks ==1927474== indirectly lost: 0 bytes in 0 blocks ==1927474== possibly lost: 0 bytes in 0 blocks ==1927474== still reachable: 131,186 bytes in 4 blocks ==1927474== suppressed: 0 bytes in 0 blocks ==1927474== ==1927474== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) Signed-off-by: eaglegai --- testcode/streamtcp.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c index b2c0d5328..36b1edeb8 100644 --- a/testcode/streamtcp.c +++ b/testcode/streamtcp.c @@ -371,15 +371,19 @@ static void send_em(const char* svr, const char* pp2_client, int udp, int usessl, int noanswer, int onarrival, int delay, int num, char** qs) { - sldns_buffer* buf = sldns_buffer_new(65553); - sldns_buffer* proxy_buf = sldns_buffer_new(65553); struct sockaddr_storage svr_addr; socklen_t svr_addrlen; int fd = open_svr(svr, udp, &svr_addr, &svr_addrlen); int i, wait_results = 0, pp2_parsed; SSL_CTX* ctx = NULL; SSL* ssl = NULL; + sldns_buffer* buf = sldns_buffer_new(65553); if(!buf) fatal_exit("out of memory"); + sldns_buffer* proxy_buf = sldns_buffer_new(65553); + if(!proxy_buf) { + sldns_buffer_free(buf); + fatal_exit("out of memory"); + } pp2_parsed = parse_pp2_client(pp2_client, udp, proxy_buf); if(usessl) { ctx = connect_sslctx_create(NULL, NULL, NULL, 0); From 40f446a499ad668f6ecca3944637d09c435b026e Mon Sep 17 00:00:00 2001 From: George Thessalonikefs Date: Fri, 21 Jul 2023 14:02:01 +0200 Subject: [PATCH 3/3] - For #857: fix mixed declarations and code. --- testcode/streamtcp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c index 388727383..84d2b65f6 100644 --- a/testcode/streamtcp.c +++ b/testcode/streamtcp.c @@ -386,10 +386,10 @@ send_em(const char* svr, const char* pp2_client, int udp, int usessl, SSL_CTX* ctx = NULL; SSL* ssl = NULL; sldns_buffer* buf = sldns_buffer_new(65553); - if(!buf) fatal_exit("out of memory"); sldns_buffer* proxy_buf = sldns_buffer_new(65553); - if(!proxy_buf) { + if(!buf || !proxy_buf) { sldns_buffer_free(buf); + sldns_buffer_free(proxy_buf); fatal_exit("out of memory"); } pp2_parsed = parse_pp2_client(pp2_client, udp, proxy_buf);