mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2026-04-26 12:01:43 +00:00
Prevented packets from overrunning their buffers
This commit is contained in:
parent
4c4b2b826c
commit
fae014d957
6 changed files with 15 additions and 2 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -76,6 +76,7 @@ struct Packet {
|
|||
u16 cursor;
|
||||
void* addr;
|
||||
bool error;
|
||||
bool writeError;
|
||||
bool reliable;
|
||||
bool levelAreaMustMatch;
|
||||
bool levelMustMatch;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue