]> granicus.if.org Git - strace/blob - xmalloc.c
Introduce memory allocation wrappers
[strace] / xmalloc.c
1 #include "defs.h"
2
3 void die_out_of_memory(void)
4 {
5         static bool recursed = false;
6
7         if (recursed)
8                 exit(1);
9         recursed = 1;
10
11         error_msg_and_die("Out of memory");
12 }
13
14 void *xmalloc(size_t size)
15 {
16         void *p = malloc(size);
17
18         if (!p)
19                 die_out_of_memory();
20
21         return p;
22 }
23
24 void *xcalloc(size_t nmemb, size_t size)
25 {
26         void *p = calloc(nmemb, size);
27
28         if (!p)
29                 die_out_of_memory();
30
31         return p;
32 }
33
34 #define HALF_SIZE_T     (((size_t) 1) << (sizeof(size_t) * 4))
35
36 void *xreallocarray(void *ptr, size_t nmemb, size_t size)
37 {
38         size_t bytes = nmemb * size;
39
40         if ((nmemb | size) >= HALF_SIZE_T &&
41             size && bytes / size != nmemb)
42                 die_out_of_memory();
43
44         void *p = realloc(ptr, bytes);
45
46         if (!p)
47                 die_out_of_memory();
48
49         return p;
50 }
51
52 char *xstrdup(const char *str)
53 {
54         char *p = strdup(str);
55
56         if (!p)
57                 die_out_of_memory();
58
59         return p;
60 }