1 /* MIT License
2 *
3 * Copyright (c) 1998 Massachusetts Institute of Technology
4 * Copyright (c) 2004 Daniel Stenberg
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice (including the next
14 * paragraph) shall be included in all copies or substantial portions of the
15 * Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 * SPDX-License-Identifier: MIT
26 */
27
28 #include "ares_private.h"
29
30 /* library-private global and unique instance vars */
31
32 #if defined(ANDROID) || defined(__ANDROID__)
33 # include "ares_android.h"
34 #endif
35
36 /* library-private global vars with source visibility restricted to this file */
37
38 static unsigned int ares_initialized;
39 static int ares_init_flags;
40
41 /* library-private global vars with visibility across the whole library */
42
43 /* Some systems may return either NULL or a valid pointer on malloc(0). c-ares
44 * should never call malloc(0) so lets return NULL so we're more likely to find
45 * an issue if it were to occur. */
46
default_malloc(size_t size)47 static void *default_malloc(size_t size)
48 {
49 if (size == 0) {
50 return NULL;
51 }
52 return malloc(size);
53 }
54
default_realloc(void * p,size_t size)55 static void *default_realloc(void *p, size_t size)
56 {
57 return realloc(p, size);
58 }
59
default_free(void * p)60 static void default_free(void *p)
61 {
62 free(p);
63 }
64
65 static void *(*__ares_malloc)(size_t size) = default_malloc;
66 static void *(*__ares_realloc)(void *ptr, size_t size) = default_realloc;
67 static void (*__ares_free)(void *ptr) = default_free;
68
ares_malloc(size_t size)69 void *ares_malloc(size_t size)
70 {
71 return __ares_malloc(size);
72 }
73
ares_realloc(void * ptr,size_t size)74 void *ares_realloc(void *ptr, size_t size)
75 {
76 return __ares_realloc(ptr, size);
77 }
78
ares_free(void * ptr)79 void ares_free(void *ptr)
80 {
81 __ares_free(ptr);
82 }
83
ares_malloc_zero(size_t size)84 void *ares_malloc_zero(size_t size)
85 {
86 void *ptr = ares_malloc(size);
87 if (ptr != NULL) {
88 memset(ptr, 0, size);
89 }
90
91 return ptr;
92 }
93
ares_realloc_zero(void * ptr,size_t orig_size,size_t new_size)94 void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size)
95 {
96 void *p = ares_realloc(ptr, new_size);
97 if (p == NULL) {
98 return NULL;
99 }
100
101 if (new_size > orig_size) {
102 memset((unsigned char *)p + orig_size, 0, new_size - orig_size);
103 }
104
105 return p;
106 }
107
ares_library_init(int flags)108 int ares_library_init(int flags)
109 {
110 if (ares_initialized) {
111 ares_initialized++;
112 return ARES_SUCCESS;
113 }
114 ares_initialized++;
115
116 /* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */
117
118 ares_init_flags = flags;
119
120 return ARES_SUCCESS;
121 }
122
ares_library_init_mem(int flags,void * (* amalloc)(size_t size),void (* afree)(void * ptr),void * (* arealloc)(void * ptr,size_t size))123 int ares_library_init_mem(int flags, void *(*amalloc)(size_t size),
124 void (*afree)(void *ptr),
125 void *(*arealloc)(void *ptr, size_t size))
126 {
127 if (amalloc) {
128 __ares_malloc = amalloc;
129 }
130 if (arealloc) {
131 __ares_realloc = arealloc;
132 }
133 if (afree) {
134 __ares_free = afree;
135 }
136 return ares_library_init(flags);
137 }
138
ares_library_cleanup(void)139 void ares_library_cleanup(void)
140 {
141 if (!ares_initialized) {
142 return;
143 }
144 ares_initialized--;
145 if (ares_initialized) {
146 return;
147 }
148
149 /* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */
150
151 #if defined(ANDROID) || defined(__ANDROID__)
152 ares_library_cleanup_android();
153 #endif
154
155 ares_init_flags = ARES_LIB_INIT_NONE;
156 __ares_malloc = default_malloc;
157 __ares_realloc = default_realloc;
158 __ares_free = default_free;
159 }
160
ares_library_initialized(void)161 int ares_library_initialized(void)
162 {
163 #ifdef USE_WINSOCK
164 if (!ares_initialized) {
165 return ARES_ENOTINITIALIZED;
166 }
167 #endif
168 return ARES_SUCCESS;
169 }
170