• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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