1/* Minimal tests to verify libc_malloc_debug.so functionality.
2 Copyright (C) 2021-2022 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License as published by the Free Software Foundation; either
8 version 2.1 of the License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public
16 License along with the GNU C Library; if not, see
17 <https://www.gnu.org/licenses/>. */
18
19#include <stdio.h>
20#include <stdlib.h>
21#include <malloc.h>
22#include <shlib-compat.h>
23#include <libc-diag.h>
24
25#include <support/check.h>
26#include <support/support.h>
27
28extern void (*volatile __free_hook) (void *, const void *);
29extern void *(*volatile __malloc_hook)(size_t, const void *);
30extern void *(*volatile __realloc_hook)(void *, size_t, const void *);
31extern void *(*volatile __memalign_hook)(size_t, size_t, const void *);
32
33int hook_count, call_count;
34
35DIAG_PUSH_NEEDS_COMMENT;
36DIAG_IGNORE_NEEDS_COMMENT (4.9, "-Wdeprecated-declarations");
37
38void
39free_called (void *mem, const void *address)
40{
41 hook_count++;
42 __free_hook = NULL;
43 free (ptr: mem);
44 __free_hook = free_called;
45}
46
47void *
48malloc_called (size_t bytes, const void *address)
49{
50 hook_count++;
51 __malloc_hook = NULL;
52 void *mem = malloc (size: bytes);
53 __malloc_hook = malloc_called;
54 return mem;
55}
56
57void *
58realloc_called (void *oldptr, size_t bytes, const void *address)
59{
60 hook_count++;
61 __realloc_hook = NULL;
62 void *mem = realloc (ptr: oldptr, size: bytes);
63 __realloc_hook = realloc_called;
64 return mem;
65}
66
67void *
68calloc_called (size_t n, size_t size, const void *address)
69{
70 hook_count++;
71 __malloc_hook = NULL;
72 void *mem = calloc (nmemb: n, size: size);
73 __malloc_hook = malloc_called;
74 return mem;
75}
76
77void *
78memalign_called (size_t align, size_t size, const void *address)
79{
80 hook_count++;
81 __memalign_hook = NULL;
82 void *mem = memalign (alignment: align, size: size);
83 __memalign_hook = memalign_called;
84 return mem;
85}
86
87static void initialize_hooks (void)
88{
89 __free_hook = free_called;
90 __malloc_hook = malloc_called;
91 __realloc_hook = realloc_called;
92 __memalign_hook = memalign_called;
93}
94void (*__malloc_initialize_hook) (void) = initialize_hooks;
95compat_symbol_reference (libc, __malloc_initialize_hook,
96 __malloc_initialize_hook, GLIBC_2_0);
97compat_symbol_reference (libc, __free_hook,
98 __free_hook, GLIBC_2_0);
99compat_symbol_reference (libc, __malloc_hook,
100 __malloc_hook, GLIBC_2_0);
101compat_symbol_reference (libc, __realloc_hook,
102 __realloc_hook, GLIBC_2_0);
103compat_symbol_reference (libc, __memalign_hook,
104 __memalign_hook, GLIBC_2_0);
105
106DIAG_POP_NEEDS_COMMENT;
107
108static int
109do_test (void)
110{
111 void *p;
112 p = malloc (size: 0);
113 TEST_VERIFY_EXIT (p != NULL);
114 call_count++;
115
116 p = realloc (ptr: p, size: 0);
117 TEST_VERIFY_EXIT (p == NULL);
118 call_count++;
119
120 p = calloc (nmemb: 512, size: 1);
121 TEST_VERIFY_EXIT (p != NULL);
122 call_count++;
123
124 free (ptr: p);
125 call_count++;
126
127 p = memalign (alignment: 0x100, size: 0x100);
128 TEST_VERIFY_EXIT (p != NULL);
129 call_count++;
130
131 free (ptr: p);
132 call_count++;
133
134 printf (format: "call_count: %d, hook_count: %d\n", call_count, hook_count);
135
136#ifdef HOOKS_ENABLED
137 TEST_VERIFY_EXIT (call_count == hook_count);
138#else
139 TEST_VERIFY_EXIT (hook_count == 0);
140#endif
141
142 exit (0);
143}
144
145#include <support/test-driver.c>
146

source code of glibc/malloc/tst-compathooks-off.c