From fae014d95769aea3b4f07b182c0fc30018ce1240 Mon Sep 17 00:00:00 2001 From: MysterD Date: Fri, 28 Jan 2022 19:12:18 -0800 Subject: [PATCH] Prevented packets from overrunning their buffers --- src/pc/djui/djui.c | 4 +++- src/pc/djui/djui_cursor.c | 2 +- src/pc/network/network.c | 3 +++ src/pc/network/packets/packet.h | 1 + src/pc/network/packets/packet_read_write.c | 6 ++++++ src/pc/network/packets/packet_reliable.c | 1 + 6 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/pc/djui/djui.c b/src/pc/djui/djui.c index e0768536e..a49434d86 100644 --- a/src/pc/djui/djui.c +++ b/src/pc/djui/djui.c @@ -55,7 +55,9 @@ void djui_render(void) { djui_popup_update(); djui_base_set_visible(&sDjuiPauseOptions->base, (sCurrPlayMode == PLAY_MODE_PAUSED)); - djui_base_render(&gDjuiRoot->base); + if (gDjuiRoot != NULL) { + djui_base_render(&gDjuiRoot->base); + } djui_cursor_update(); djui_interactable_update(); diff --git a/src/pc/djui/djui_cursor.c b/src/pc/djui/djui_cursor.c index 3465414a9..4860d279c 100644 --- a/src/pc/djui/djui_cursor.c +++ b/src/pc/djui/djui_cursor.c @@ -7,7 +7,7 @@ extern ALIGNED8 u8 gd_texture_hand_open[]; extern ALIGNED8 u8 gd_texture_hand_closed[]; -static struct DjuiImage* sMouseCursor = NULL; +struct DjuiImage* sMouseCursor = NULL; static bool sCursorMouseControlled = false; static struct DjuiBase* sInputControlledBase = NULL; diff --git a/src/pc/network/network.c b/src/pc/network/network.c index 8991db987..13084ab6b 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -230,6 +230,9 @@ void network_send_to(u8 localIndex, struct Packet* p) { } void network_send(struct Packet* p) { + // prevent errors during writing from propagating + if (p->writeError) { return; } + // set the flags again packet_set_flags(p); diff --git a/src/pc/network/packets/packet.h b/src/pc/network/packets/packet.h index e91ca022b..84724c41a 100644 --- a/src/pc/network/packets/packet.h +++ b/src/pc/network/packets/packet.h @@ -76,6 +76,7 @@ struct Packet { u16 cursor; void* addr; bool error; + bool writeError; bool reliable; bool levelAreaMustMatch; bool levelMustMatch; diff --git a/src/pc/network/packets/packet_read_write.c b/src/pc/network/packets/packet_read_write.c index 61f4091d6..f2ef35955 100644 --- a/src/pc/network/packets/packet_read_write.c +++ b/src/pc/network/packets/packet_read_write.c @@ -18,6 +18,7 @@ void packet_init(struct Packet* packet, enum PacketType packetType, bool reliabl packet->cursor = 0; packet->dataLength = 0; packet->error = false; + packet->writeError = false; packet->reliable = reliable; packet->levelAreaMustMatch = (levelAreaMustMatch == PLMT_AREA); packet->levelMustMatch = (levelAreaMustMatch == PLMT_LEVEL); @@ -82,6 +83,7 @@ void packet_duplicate(struct Packet* srcPacket, struct Packet* dstPacket) { dstPacket->cursor = 0; dstPacket->dataLength = 0; dstPacket->error = srcPacket->error; + dstPacket->writeError = srcPacket->writeError; dstPacket->reliable = srcPacket->reliable; dstPacket->levelAreaMustMatch = srcPacket->levelAreaMustMatch; dstPacket->levelMustMatch = srcPacket->levelMustMatch; @@ -125,6 +127,10 @@ void packet_set_destination(struct Packet* packet, u8 destGlobalId) { void packet_write(struct Packet* packet, void* data, u16 length) { if (data == NULL) { packet->error = true; return; } + if (packet->cursor + length >= PACKET_LENGTH) { + SOFT_ASSERT(packet->cursor + length < PACKET_LENGTH); + packet->writeError = true; + } memcpy(&packet->buffer[packet->cursor], data, length); packet->dataLength += length; packet->cursor += length; diff --git a/src/pc/network/packets/packet_reliable.c b/src/pc/network/packets/packet_reliable.c index 3e433f342..729ec42e1 100644 --- a/src/pc/network/packets/packet_reliable.c +++ b/src/pc/network/packets/packet_reliable.c @@ -86,6 +86,7 @@ void network_receive_ack(struct Packet* p) { void network_remember_reliable(struct Packet* p) { if (!p->reliable) { return; } if (p->sent) { return; } + if (p->writeError) { return; } struct PacketLinkedList* node = calloc(1, sizeof(struct PacketLinkedList)); node->p = *p;