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_setup.h"
29
30 #include "ares.h"
31 #include "ares_private.h"
32
33 /* library-private global and unique instance vars */
34
35 #if defined(ANDROID) || defined(__ANDROID__)
36 # include "ares_android.h"
37 #endif
38
39 /* library-private global vars with source visibility restricted to this file */
40
41 static unsigned int ares_initialized;
42 static int ares_init_flags;
43
44 /* library-private global vars with visibility across the whole library */
45
46 /* Some systems may return either NULL or a valid pointer on malloc(0). c-ares
47 * should never call malloc(0) so lets return NULL so we're more likely to find
48 * an issue if it were to occur. */
49
default_malloc(size_t size)50 static void *default_malloc(size_t size)
51 {
52 if (size == 0) {
53 return NULL;
54 }
55 return malloc(size);
56 }
57
58 #if defined(WIN32)
59 /* We need indirections to handle Windows DLL rules. */
default_realloc(void * p,size_t size)60 static void *default_realloc(void *p, size_t size)
61 {
62 return realloc(p, size);
63 }
64
default_free(void * p)65 static void default_free(void *p)
66 {
67 free(p);
68 }
69 #else
70 # define default_realloc realloc
71 # define default_free free
72 #endif
73 void *(*ares_malloc)(size_t size) = default_malloc;
74 void *(*ares_realloc)(void *ptr, size_t size) = default_realloc;
75 void (*ares_free)(void *ptr) = default_free;
76
ares_malloc_zero(size_t size)77 void *ares_malloc_zero(size_t size)
78 {
79 void *ptr = ares_malloc(size);
80 if (ptr != NULL) {
81 memset(ptr, 0, size);
82 }
83
84 return ptr;
85 }
86
ares_realloc_zero(void * ptr,size_t orig_size,size_t new_size)87 void *ares_realloc_zero(void *ptr, size_t orig_size, size_t new_size)
88 {
89 void *p = ares_realloc(ptr, new_size);
90 if (p == NULL) {
91 return NULL;
92 }
93
94 if (new_size > orig_size) {
95 memset((unsigned char *)p + orig_size, 0, new_size - orig_size);
96 }
97
98 return p;
99 }
100
ares_library_init(int flags)101 int ares_library_init(int flags)
102 {
103 if (ares_initialized) {
104 ares_initialized++;
105 return ARES_SUCCESS;
106 }
107 ares_initialized++;
108
109 /* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */
110
111 ares_init_flags = flags;
112
113 return ARES_SUCCESS;
114 }
115
ares_library_init_mem(int flags,void * (* amalloc)(size_t size),void (* afree)(void * ptr),void * (* arealloc)(void * ptr,size_t size))116 int ares_library_init_mem(int flags, void *(*amalloc)(size_t size),
117 void (*afree)(void *ptr),
118 void *(*arealloc)(void *ptr, size_t size))
119 {
120 if (amalloc) {
121 ares_malloc = amalloc;
122 }
123 if (arealloc) {
124 ares_realloc = arealloc;
125 }
126 if (afree) {
127 ares_free = afree;
128 }
129 return ares_library_init(flags);
130 }
131
ares_library_cleanup(void)132 void ares_library_cleanup(void)
133 {
134 if (!ares_initialized) {
135 return;
136 }
137 ares_initialized--;
138 if (ares_initialized) {
139 return;
140 }
141
142 /* NOTE: ARES_LIB_INIT_WIN32 flag no longer used */
143
144 #if defined(ANDROID) || defined(__ANDROID__)
145 ares_library_cleanup_android();
146 #endif
147
148 ares_init_flags = ARES_LIB_INIT_NONE;
149 ares_malloc = malloc;
150 ares_realloc = realloc;
151 ares_free = free;
152 }
153
ares_library_initialized(void)154 int ares_library_initialized(void)
155 {
156 #ifdef USE_WINSOCK
157 if (!ares_initialized) {
158 return ARES_ENOTINITIALIZED;
159 }
160 #endif
161 return ARES_SUCCESS;
162 }
163