From 0e0f41c0e3d9c67fc669e975060e88bccdc7d823 Mon Sep 17 00:00:00 2001 From: Ben Gamari <ben@smart-cactus.org> Date: Wed, 15 Nov 2023 19:28:41 -0500 Subject: [PATCH] rts/eventlog: Avoid truncating event sizes Previously ensureRoomForVariableEvent would truncate the desired size to 16-bits, resulting in #24197. Fixes #24197. --- rts/eventlog/EventLog.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/rts/eventlog/EventLog.c b/rts/eventlog/EventLog.c index 6b622f803256..bdab34c3db24 100644 --- a/rts/eventlog/EventLog.c +++ b/rts/eventlog/EventLog.c @@ -136,12 +136,12 @@ static void postBlockMarker(EventsBuf *eb); static void closeBlockMarker(EventsBuf *ebuf); static StgBool hasRoomForEvent(EventsBuf *eb, EventTypeNum eNum); -static StgBool hasRoomForVariableEvent(EventsBuf *eb, uint32_t payload_bytes); +static StgBool hasRoomForVariableEvent(EventsBuf *eb, StgWord payload_bytes); static void freeEventLoggingBuffer(void); static void ensureRoomForEvent(EventsBuf *eb, EventTypeNum tag); -static int ensureRoomForVariableEvent(EventsBuf *eb, StgWord16 size); +static int ensureRoomForVariableEvent(EventsBuf *eb, StgWord size); static inline void postWord8(EventsBuf *eb, StgWord8 i) { @@ -1509,9 +1509,9 @@ StgBool hasRoomForEvent(EventsBuf *eb, EventTypeNum eNum) } STG_WARN_UNUSED_RESULT -StgBool hasRoomForVariableEvent(EventsBuf *eb, uint32_t payload_bytes) +StgBool hasRoomForVariableEvent(EventsBuf *eb, StgWord payload_bytes) { - uint32_t size = sizeof(EventTypeNum) + sizeof(EventTimestamp) + + StgWord size = sizeof(EventTypeNum) + sizeof(EventTimestamp) + sizeof(EventPayloadSize) + payload_bytes; if (eb->pos + size > eb->begin + eb->size) { @@ -1526,17 +1526,19 @@ void ensureRoomForEvent(EventsBuf *eb, EventTypeNum tag) if (!hasRoomForEvent(eb, tag)) { // Flush event buffer to make room for new event. printAndClearEventBuf(eb); + ASSERT(hasRoomForEvent(eb, tag)); } } STG_WARN_UNUSED_RESULT -int ensureRoomForVariableEvent(EventsBuf *eb, StgWord16 size) +int ensureRoomForVariableEvent(EventsBuf *eb, StgWord size) { if (!hasRoomForVariableEvent(eb, size)) { // Flush event buffer to make room for new event. printAndClearEventBuf(eb); - if (!hasRoomForVariableEvent(eb, size)) + if (!hasRoomForVariableEvent(eb, size)) { return 1; // Not enough space + } } return 0; } -- GitLab