aboutsummaryrefslogtreecommitdiffstats
path: root/libtest/libtest_check_no_leaks.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-05-14 18:41:02 +0200
committerMattias Andrée <m@maandree.se>2026-05-14 18:41:02 +0200
commitd2f778db43f0c703634e901fee7c929ebd0c8072 (patch)
tree7a47ad3fa89ddf2fc4bb0c5889454ca281ab9551 /libtest/libtest_check_no_leaks.c
parent100% (diff)
downloadlibrecrypt-d2f778db43f0c703634e901fee7c929ebd0c8072.tar.gz
librecrypt-d2f778db43f0c703634e901fee7c929ebd0c8072.tar.bz2
librecrypt-d2f778db43f0c703634e901fee7c929ebd0c8072.tar.xz
Fix libtest
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to '')
-rw-r--r--libtest/libtest_check_no_leaks.c42
1 files changed, 39 insertions, 3 deletions
diff --git a/libtest/libtest_check_no_leaks.c b/libtest/libtest_check_no_leaks.c
index aa99377..faaf724 100644
--- a/libtest/libtest_check_no_leaks.c
+++ b/libtest/libtest_check_no_leaks.c
@@ -46,27 +46,63 @@ out:
int
libtest_check_no_leaks(void)
{
- return libtest_fd_tracking(-1) & check_no_memory_leaks();
+ int r = 1;
+ r &= libtest_fd_tracking(-1);
+ r &= check_no_memory_leaks();
+ return r;
}
#else
+#define p libtest_ptr___
+extern unsigned char *volatile p;
+unsigned char *volatile p;
+
+
int
main(void)
{
- void *p;
+#ifdef WITH_BACKTRACE
+ int fd1, fd2;
+#endif
SET_UP_ALARM();
+#ifdef WITH_BACKTRACE
+ fd1 = dup(STDERR_FILENO);
+ assert(fd1 >= 0 || errno == EBADF);
+ assert(fd1 != STDERR_FILENO);
+ if (fd1 >= 0) {
+ close(STDERR_FILENO);
+ fd2 = open("/dev/null", O_WRONLY);
+ assert(fd2 >= 0);
+ if (fd2 != STDERR_FILENO) {
+ assert(dup2(fd2, STDERR_FILENO) == STDERR_FILENO);
+ close(fd2);
+ }
+ }
+ libtest_print_backtrace(stderr, "", "", 0u, NULL, NULL);
+ if (fd1 >= 0) {
+ assert(dup2(fd1, STDERR_FILENO) == STDERR_FILENO);
+ close(fd1);
+ }
+#endif
+
libtest_start_tracking();
- assert(p = malloc(1u));
+ assert(!libtest_kill_malloc_tracking);
+ p = malloc(1u);
+ assert(p);
libtest_suppress_leak_output = 1;
+ *p = 0;
+ atomic_thread_fence(memory_order_seq_cst);
EXPECT(!libtest_check_no_leaks());
+ atomic_thread_fence(memory_order_seq_cst);
libtest_suppress_leak_output = 0;
free(p);
libtest_stop_tracking();
+ atomic_thread_fence(memory_order_seq_cst);
EXPECT(libtest_check_no_leaks());
return 0;