/src/ntp-dev/libntp/emalloc.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * emalloc - return new memory obtained from the system. Belch if none. |
3 | | */ |
4 | | #include <config.h> |
5 | | #include "ntp_types.h" |
6 | | #include "ntp_malloc.h" |
7 | | #include "ntp_syslog.h" |
8 | | #include "ntp_stdlib.h" |
9 | | |
10 | | |
11 | | /* |
12 | | * When using the debug MS CRT allocator, each allocation stores the |
13 | | * callsite __FILE__ and __LINE__, which is then displayed at process |
14 | | * termination, to track down leaks. We don't want all of our |
15 | | * allocations to show up as coming from emalloc.c, so we preserve the |
16 | | * original callsite's source file and line using macros which pass |
17 | | * __FILE__ and __LINE__ as parameters to these routines. |
18 | | * Other debug malloc implementations can be used by defining |
19 | | * EREALLOC_IMPL() as ports/winnt/include/config.h does. |
20 | | */ |
21 | | |
22 | | void * |
23 | | ereallocz( |
24 | | void * ptr, |
25 | | size_t newsz, |
26 | | size_t priorsz, |
27 | | int zero_init |
28 | | #ifdef EREALLOC_CALLSITE /* ntp_malloc.h */ |
29 | | , |
30 | | const char * file, |
31 | | int line |
32 | | #endif |
33 | | ) |
34 | 69.7k | { |
35 | 69.7k | char * mem; |
36 | 69.7k | size_t allocsz; |
37 | | |
38 | 69.7k | if (0 == newsz) |
39 | 0 | allocsz = 1; |
40 | 69.7k | else |
41 | 69.7k | allocsz = newsz; |
42 | | |
43 | 69.7k | mem = EREALLOC_IMPL(ptr, allocsz, file, line); |
44 | 69.7k | if (NULL == mem) { |
45 | 0 | msyslog_term = TRUE; |
46 | 0 | #ifndef EREALLOC_CALLSITE |
47 | 0 | msyslog(LOG_ERR, "fatal out of memory (%lu bytes)", |
48 | 0 | (u_long)newsz); |
49 | | #else |
50 | | msyslog(LOG_ERR, |
51 | | "fatal out of memory %s line %d (%lu bytes)", |
52 | | file, line, (u_long)newsz); |
53 | | #endif |
54 | 0 | exit(1); |
55 | 0 | } |
56 | | |
57 | 69.7k | if (zero_init && newsz > priorsz) |
58 | 144 | zero_mem(mem + priorsz, newsz - priorsz); |
59 | | |
60 | 69.7k | return mem; |
61 | 69.7k | } |
62 | | |
63 | | /* oreallocarray.c is licensed under the following: |
64 | | * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net> |
65 | | * |
66 | | * Permission to use, copy, modify, and distribute this software for any |
67 | | * purpose with or without fee is hereby granted, provided that the above |
68 | | * copyright notice and this permission notice appear in all copies. |
69 | | * |
70 | | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
71 | | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
72 | | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
73 | | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
74 | | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
75 | | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
76 | | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
77 | | */ |
78 | | |
79 | | /* |
80 | | * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX |
81 | | * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW |
82 | | */ |
83 | 3 | #define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4)) |
84 | | |
85 | | void * |
86 | | oreallocarrayxz( |
87 | | void *optr, |
88 | | size_t nmemb, |
89 | | size_t size, |
90 | | size_t extra |
91 | | #ifdef EREALLOC_CALLSITE /* ntp_malloc.h */ |
92 | | , |
93 | | const char * file, |
94 | | int line |
95 | | #endif |
96 | | ) |
97 | 1 | { |
98 | 1 | if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) && |
99 | 1 | nmemb > 0 && SIZE_MAX / nmemb < size) { |
100 | 0 | #ifndef EREALLOC_CALLSITE |
101 | 0 | msyslog(LOG_ERR, "fatal allocation size overflow"); |
102 | | #else |
103 | | msyslog(LOG_ERR, |
104 | | "fatal allocation size overflow %s line %d", |
105 | | file, line); |
106 | | #endif |
107 | 0 | exit(1); |
108 | 0 | } |
109 | 1 | #ifndef EREALLOC_CALLSITE |
110 | 1 | return ereallocz(optr, extra + (size * nmemb), 0, TRUE); |
111 | | #else |
112 | | return ereallocz(optr, extra + (size * nmemb), 0, TRUE, file, line); |
113 | | #endif |
114 | 1 | } |
115 | | |
116 | | char * |
117 | | estrdup_impl( |
118 | | const char * str |
119 | | #ifdef EREALLOC_CALLSITE |
120 | | , |
121 | | const char * file, |
122 | | int line |
123 | | #endif |
124 | | ) |
125 | 266 | { |
126 | 266 | char * copy; |
127 | 266 | size_t bytes; |
128 | | |
129 | 266 | bytes = strlen(str) + 1; |
130 | 266 | copy = ereallocz(NULL, bytes, 0, FALSE |
131 | | #ifdef EREALLOC_CALLSITE |
132 | | , file, line |
133 | | #endif |
134 | 266 | ); |
135 | 266 | memcpy(copy, str, bytes); |
136 | | |
137 | 266 | return copy; |
138 | 266 | } |
139 | | |
140 | | |
141 | | #if 0 |
142 | | #ifndef EREALLOC_CALLSITE |
143 | | void * |
144 | | emalloc(size_t newsz) |
145 | | { |
146 | | return ereallocz(NULL, newsz, 0, FALSE); |
147 | | } |
148 | | #endif |
149 | | #endif |
150 | | |