diff options
| author | Mattias Andrée <m@maandree.se> | 2026-05-14 18:41:02 +0200 |
|---|---|---|
| committer | Mattias Andrée <m@maandree.se> | 2026-05-14 18:41:02 +0200 |
| commit | d2f778db43f0c703634e901fee7c929ebd0c8072 (patch) | |
| tree | 7a47ad3fa89ddf2fc4bb0c5889454ca281ab9551 /libtest/libtest_check_no_leaks.c | |
| parent | 100% (diff) | |
| download | librecrypt-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 'libtest/libtest_check_no_leaks.c')
| -rw-r--r-- | libtest/libtest_check_no_leaks.c | 42 |
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; |
