From bf3f270067edace892677aef309177abb981491a Mon Sep 17 00:00:00 2001 From: IFAKA <99131130+IFAKA@users.noreply.github.com> Date: Sun, 21 Dec 2025 03:34:58 +0100 Subject: [PATCH] fix: add NULL checks for frameBuffer in GfxRenderer (#79) ## Problem `invertScreen()`, `storeBwBuffer()`, and `restoreBwBuffer()` dereference `frameBuffer` without NULL validation. If the display isn't initialized, these functions will crash. ## Fix Add NULL checks before using `frameBuffer` in all three functions. Follows the existing pattern from `drawPixel()` (line 11) which already validates the pointer. Changed `lib/GfxRenderer/GfxRenderer.cpp`. ## Test - Follows existing validated pattern from `drawPixel()` - No logic changes - only adds early return on NULL - Manual device testing appreciated --- lib/GfxRenderer/GfxRenderer.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/GfxRenderer/GfxRenderer.cpp b/lib/GfxRenderer/GfxRenderer.cpp index 19c959f8..b1a98c7e 100644 --- a/lib/GfxRenderer/GfxRenderer.cpp +++ b/lib/GfxRenderer/GfxRenderer.cpp @@ -183,6 +183,10 @@ void GfxRenderer::clearScreen(const uint8_t color) const { einkDisplay.clearScre void GfxRenderer::invertScreen() const { uint8_t* buffer = einkDisplay.getFrameBuffer(); + if (!buffer) { + Serial.printf("[%lu] [GFX] !! No framebuffer in invertScreen\n", millis()); + return; + } for (int i = 0; i < EInkDisplay::BUFFER_SIZE; i++) { buffer[i] = ~buffer[i]; } @@ -256,6 +260,10 @@ void GfxRenderer::freeBwBufferChunks() { */ void GfxRenderer::storeBwBuffer() { const uint8_t* frameBuffer = einkDisplay.getFrameBuffer(); + if (!frameBuffer) { + Serial.printf("[%lu] [GFX] !! No framebuffer in storeBwBuffer\n", millis()); + return; + } // Allocate and copy each chunk for (size_t i = 0; i < BW_BUFFER_NUM_CHUNKS; i++) { @@ -306,6 +314,12 @@ void GfxRenderer::restoreBwBuffer() { } uint8_t* frameBuffer = einkDisplay.getFrameBuffer(); + if (!frameBuffer) { + Serial.printf("[%lu] [GFX] !! No framebuffer in restoreBwBuffer\n", millis()); + freeBwBufferChunks(); + return; + } + for (size_t i = 0; i < BW_BUFFER_NUM_CHUNKS; i++) { // Check if chunk is missing if (!bwBufferChunks[i]) {