88 */
99#include "LAN_discovery.h"
1010
11- #include <stdlib.h>
12-
1311#if defined(_WIN32 ) || defined(__WIN32__ ) || defined(WIN32 )
1412// The mingw32/64 Windows library warns about including winsock2.h after
1513// windows.h even though with the above it's a valid thing to do. So, to make
4139#include "attributes.h"
4240#include "ccompat.h"
4341#include "crypto_core.h"
42+ #include "mem.h"
4443#include "network.h"
4544
4645#define MAX_INTERFACES 16
4746
4847struct Broadcast_Info {
48+ const Memory * mem ;
49+
4950 uint32_t count ;
5051 IP ips [MAX_INTERFACES ];
5152};
5253
5354#if defined(_WIN32 ) || defined(__WIN32__ ) || defined(WIN32 )
5455
5556non_null ()
56- static Broadcast_Info * fetch_broadcast_info (const Network * ns )
57+ static Broadcast_Info * fetch_broadcast_info (const Memory * mem , const Network * ns )
5758{
58- Broadcast_Info * broadcast = (Broadcast_Info * )calloc ( 1 , sizeof (Broadcast_Info ));
59+ Broadcast_Info * broadcast = (Broadcast_Info * )mem_alloc ( mem , sizeof (Broadcast_Info ));
5960
6061 if (broadcast == nullptr ) {
6162 return nullptr ;
6263 }
6364
64- IP_ADAPTER_INFO * adapter_info = (IP_ADAPTER_INFO * )malloc (sizeof (IP_ADAPTER_INFO ));
65+ broadcast -> mem = mem ;
66+
67+ IP_ADAPTER_INFO * adapter_info = (IP_ADAPTER_INFO * )mem_balloc (mem , sizeof (IP_ADAPTER_INFO ));
6568
6669 if (adapter_info == nullptr ) {
67- free ( broadcast );
70+ mem_delete ( mem , broadcast );
6871 return nullptr ;
6972 }
7073
7174 unsigned long out_buf_len = sizeof (IP_ADAPTER_INFO );
7275
7376 if (GetAdaptersInfo (adapter_info , & out_buf_len ) == ERROR_BUFFER_OVERFLOW ) {
74- free ( adapter_info );
75- IP_ADAPTER_INFO * new_adapter_info = (IP_ADAPTER_INFO * )malloc ( out_buf_len );
77+ mem_delete ( mem , adapter_info );
78+ IP_ADAPTER_INFO * new_adapter_info = (IP_ADAPTER_INFO * )mem_balloc ( mem , out_buf_len );
7679
7780 if (new_adapter_info == nullptr ) {
78- free ( broadcast );
81+ mem_delete ( mem , broadcast );
7982 return nullptr ;
8083 }
8184
@@ -113,7 +116,7 @@ static Broadcast_Info *fetch_broadcast_info(const Network *ns)
113116 }
114117
115118 if (adapter_info != nullptr ) {
116- free ( adapter_info );
119+ mem_delete ( mem , adapter_info );
117120 }
118121
119122 return broadcast ;
@@ -122,22 +125,24 @@ static Broadcast_Info *fetch_broadcast_info(const Network *ns)
122125#elif !defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION ) && (defined(__linux__ ) || defined(__FreeBSD__ ) || defined(__DragonFly__ ))
123126
124127non_null ()
125- static Broadcast_Info * fetch_broadcast_info (const Network * ns )
128+ static Broadcast_Info * fetch_broadcast_info (const Memory * mem , const Network * ns )
126129{
127- Broadcast_Info * broadcast = (Broadcast_Info * )calloc ( 1 , sizeof (Broadcast_Info ));
130+ Broadcast_Info * broadcast = (Broadcast_Info * )mem_alloc ( mem , sizeof (Broadcast_Info ));
128131
129132 if (broadcast == nullptr ) {
130133 return nullptr ;
131134 }
132135
136+ broadcast -> mem = mem ;
137+
133138 /* Not sure how many platforms this will run on,
134139 * so it's wrapped in `__linux__` for now.
135140 * Definitely won't work like this on Windows...
136141 */
137142 const Socket sock = net_socket (ns , net_family_ipv4 (), TOX_SOCK_STREAM , 0 );
138143
139144 if (!sock_valid (sock )) {
140- free ( broadcast );
145+ mem_delete ( mem , broadcast );
141146 return nullptr ;
142147 }
143148
@@ -150,7 +155,7 @@ static Broadcast_Info *fetch_broadcast_info(const Network *ns)
150155
151156 if (ioctl (net_socket_to_native (sock ), SIOCGIFCONF , & ifc ) < 0 ) {
152157 kill_sock (ns , sock );
153- free ( broadcast );
158+ mem_delete ( mem , broadcast );
154159 return nullptr ;
155160 }
156161
@@ -197,9 +202,17 @@ static Broadcast_Info *fetch_broadcast_info(const Network *ns)
197202#else // TODO(irungentoo): Other platforms?
198203
199204non_null ()
200- static Broadcast_Info * fetch_broadcast_info (const Network * ns )
205+ static Broadcast_Info * fetch_broadcast_info (const Memory * mem , const Network * ns )
201206{
202- return (Broadcast_Info * )calloc (1 , sizeof (Broadcast_Info ));
207+ Broadcast_Info * broadcast = (Broadcast_Info * )mem_alloc (mem , sizeof (Broadcast_Info ));
208+
209+ if (broadcast == nullptr ) {
210+ return nullptr ;
211+ }
212+
213+ broadcast -> mem = mem ;
214+
215+ return broadcast ;
203216}
204217
205218#endif /* platforms */
@@ -375,12 +388,16 @@ bool lan_discovery_send(const Networking_Core *net, const Broadcast_Info *broadc
375388 return res ;
376389}
377390
378- Broadcast_Info * lan_discovery_init (const Network * ns )
391+ Broadcast_Info * lan_discovery_init (const Memory * mem , const Network * ns )
379392{
380- return fetch_broadcast_info (ns );
393+ return fetch_broadcast_info (mem , ns );
381394}
382395
383396void lan_discovery_kill (Broadcast_Info * broadcast )
384397{
385- free (broadcast );
398+ if (broadcast == nullptr ) {
399+ return ;
400+ }
401+
402+ mem_delete (broadcast -> mem , broadcast );
386403}
0 commit comments