Prevented packets from overrunning their buffers

This commit is contained in:
MysterD 2022-01-28 19:12:18 -08:00
parent 4c4b2b826c
commit fae014d957
6 changed files with 15 additions and 2 deletions

View file

@ -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();

View file

@ -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;

View file

@ -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);

View file

@ -76,6 +76,7 @@ struct Packet {
u16 cursor;
void* addr;
bool error;
bool writeError;
bool reliable;
bool levelAreaMustMatch;
bool levelMustMatch;

View file

@ -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;

View file

@ -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;