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
#endif #endif
#define CC_WIN_BACKEND_TERMINAL 0x01 /* Lowest 4 bits are for backends in same group */
#define CC_WIN_BACKEND_SDL2 0x11 /* Rest of the bits indicate the unique group type */
#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
#define CC_GFX_BACKEND_SOFTGPU 0x01 #define CC_WIN_BACKEND_TERMINAL 0x0001
#define CC_GFX_BACKEND_GL_MASK 0x10 #define CC_WIN_BACKEND_SDL_MASK 0x0010
#define CC_GFX_BACKEND_GL1 0x11 #define CC_WIN_BACKEND_SDL2 0x0011
#define CC_GFX_BACKEND_GL2 0x12 #define CC_WIN_BACKEND_SDL3 0x0012
#define CC_GFX_BACKEND_D3D9 0x21 #define CC_WIN_BACKEND_X11 0x0021
#define CC_GFX_BACKEND_D3D11 0x31 #define CC_WIN_BACKEND_WIN32 0x0041
#define CC_GFX_BACKEND_VULKAN 0x41 #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_NETWORKING
#define CC_BUILD_FREETYPE #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; if (!cur->ai_addrlen) break;
// TODO citra returns empty addresses past first one? does that happen on real hardware too? // 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); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen;
} }
freeaddrinfo(result); 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++) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next, i++)
{ {
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen;
} }
freeaddrinfo(result); 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++) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next, i++)
{ {
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen;
} }
freeaddrinfo(result); 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) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{ {
if (cur->ai_family != AF_INET) continue; if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
addrs[i].size = cur->ai_addrlen; i++;
} }
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{ {
if (cur->ai_family == AF_INET) continue; if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
addrs[i].size = cur->ai_addrlen; i++;
} }
freeaddrinfo(result); 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) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{ {
if (cur->ai_family != AF_INET) continue; if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
addrs[i].size = cur->ai_addrlen; i++;
} }
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{ {
if (cur->ai_family == AF_INET) continue; if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
addrs[i].size = cur->ai_addrlen; i++;
} }
freeaddrinfo(result); 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) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{ {
if (cur->ai_family != AF_INET) continue; if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
addrs[i].size = cur->ai_addrlen; i++;
} }
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{ {
if (cur->ai_family == AF_INET) continue; if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
addrs[i].size = cur->ai_addrlen; i++;
} }
freeaddrinfo(result); 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) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{ {
if (cur->ai_family != AF_INET) continue; if (cur->ai_family != AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
addrs[i].size = cur->ai_addrlen; i++;
} }
for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next)
{ {
if (cur->ai_family == AF_INET) continue; if (cur->ai_family == AF_INET) continue;
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen); i++;
addrs[i].size = cur->ai_addrlen; i++;
} }
_freeaddrinfo(result); _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++) for (cur = result; cur && i < SOCKET_MAX_ADDRS; cur = cur->ai_next, i++)
{ {
Mem_Copy(addrs[i].data, cur->ai_addr, cur->ai_addrlen); SocketAddr_Set(&addrs[i], cur->ai_addr, cur->ai_addrlen);
addrs[i].size = cur->ai_addrlen;
} }
lwip_freeaddrinfo(result); lwip_freeaddrinfo(result);

View File

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