Add a safer way of setting socket addresses

This commit is contained in:
UnknownShadow200 2024-06-05 18:05:38 +10:00
parent 77e1786d29
commit 98f7d2126d
11 changed files with 43 additions and 40 deletions

View File

@ -117,22 +117,26 @@ typedef cc_uint8 cc_bool;
#endif
#endif
#define CC_WIN_BACKEND_TERMINAL 0x01
#define CC_WIN_BACKEND_SDL2 0x11
#define CC_WIN_BACKEND_SDL3 0x12
#define CC_WIN_BACKEND_X11 0x21
#define CC_WIN_BACKEND_WIN32 0x31
#define CC_WIN_BACKEND_COCOA 0x41
#define CC_WIN_BACKEND_BEOS 0x51
#define CC_WIN_BACKEND_ANDROID 0x61
/* Lowest 4 bits are for backends in same group */
/* Rest of the bits indicate the unique group type */
#define CC_GFX_BACKEND_SOFTGPU 0x01
#define CC_GFX_BACKEND_GL_MASK 0x10
#define CC_GFX_BACKEND_GL1 0x11
#define CC_GFX_BACKEND_GL2 0x12
#define CC_GFX_BACKEND_D3D9 0x21
#define CC_GFX_BACKEND_D3D11 0x31
#define CC_GFX_BACKEND_VULKAN 0x41
#define CC_WIN_BACKEND_TERMINAL 0x0001
#define CC_WIN_BACKEND_SDL_MASK 0x0010
#define CC_WIN_BACKEND_SDL2 0x0011
#define CC_WIN_BACKEND_SDL3 0x0012
#define CC_WIN_BACKEND_X11 0x0021
#define CC_WIN_BACKEND_WIN32 0x0041
#define CC_WIN_BACKEND_COCOA 0x0081
#define CC_WIN_BACKEND_BEOS 0x0101
#define CC_WIN_BACKEND_ANDROID 0x0201
#define CC_GFX_BACKEND_SOFTGPU 0x0001
#define CC_GFX_BACKEND_GL_MASK 0x0010
#define CC_GFX_BACKEND_GL1 0x0011
#define CC_GFX_BACKEND_GL2 0x0012
#define CC_GFX_BACKEND_D3D9 0x0021
#define CC_GFX_BACKEND_D3D11 0x0041
#define CC_GFX_BACKEND_VULKAN 0x0081
#define CC_BUILD_NETWORKING
#define CC_BUILD_FREETYPE

View File

@ -311,8 +311,7 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
if (!cur->ai_addrlen) break;
// TODO citra returns empty addresses past first one? does that happen on real hardware too?
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen);
}
freeaddrinfo(result);

View File

@ -368,8 +368,7 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next, i++)
{
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen);
}
freeaddrinfo(result);

View File

@ -474,8 +474,7 @@ static cc_result ParseHost(const char* host, int port, cc_sockaddr* addrs, int*
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next, i++)
{
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen);
}
freeaddrinfo(result);

View File

@ -595,15 +595,13 @@ static cc_result ParseHost(const char* host, int port, cc_sockaddr* addrs, int*
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
freeaddrinfo(result);

View File

@ -384,15 +384,13 @@ static cc_result ParseHost(const char* host, int port, cc_sockaddr* addrs, int*
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
freeaddrinfo(result);

View File

@ -331,15 +331,13 @@ static cc_result ParseHost(const char* host, int port, cc_sockaddr* addrs, int*
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
freeaddrinfo(result);

View File

@ -556,15 +556,13 @@ static cc_result ParseHostNew(char* host, int port, cc_sockaddr* addrs, int* num
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{
if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen; i++;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
}
_freeaddrinfo(result);

View File

@ -336,8 +336,7 @@ cc_result Socket_ParseAddress(const cc_string* address, int port, cc_sockaddr* a
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next, i++)
{
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen;
SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen);
}
lwip_freeaddrinfo(result);

View File

@ -13,14 +13,16 @@ void Queue_Init(struct Queue* queue, cc_uint32 structSize) {
queue->head = 0;
queue->tail = 0;
}
void Queue_Clear(struct Queue* queue) {
if (!queue->entries) return;
Mem_Free(queue->entries);
Queue_Init(queue, queue->structSize);
}
static void Queue_Resize(struct Queue* queue) {
cc_uint8* entries;
int idx, capacity, headToEndSize, byteOffsetToHead;
int capacity, headToEndSize, byteOffsetToHead;
if (queue->capacity >= (Int32_MaxValue / 4)) {
Chat_AddRaw("&cToo many generic queue entries, clearing");
@ -49,6 +51,7 @@ static void Queue_Resize(struct Queue* queue) {
queue->head = 0;
queue->tail = queue->count;
}
/* Appends an entry to the end of the queue, resizing if necessary. */
void Queue_Enqueue(struct Queue* queue, void* item) {
if (queue->count == queue->capacity)
@ -59,6 +62,7 @@ void Queue_Enqueue(struct Queue* queue, void* item) {
queue->tail = (queue->tail + 1) & queue->mask;
queue->count++;
}
/* Retrieves the entry from the front of the queue. */
void* Queue_Dequeue(struct Queue* queue) {
void* result = queue->entries + queue->head * queue->structSize;

View File

@ -90,6 +90,13 @@ int Stopwatch_ElapsedMS(cc_uint64 beg, cc_uint64 end) {
return (int)raw / 1000;
}
static CC_INLINE void SocketAddr_Set(cc_sockaddr* addr, const void* src, unsigned srcLen) {
if (srcLen > CC_SOCKETADDR_MAXSIZE) Logger_Abort("Attempted to copy too large socket");
Mem_Copy(addr->data, src, srcLen);
addr->size = srcLen;
}
cc_result Socket_WriteAll(cc_socket socket, const cc_uint8* data, cc_uint32 count) {
cc_uint32 sent;
cc_result res;