From 5d428a3a338edacdcdad9577c93f3bfb2e66bda0 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Fri, 21 Apr 2017 18:46:29 -0400 Subject: [PATCH] Fix buffer underflow in drawPlusMask When sRow == -1 drawPlusMask can cause buffer underflow if it's interrupted by an interrupt that changes memory that it's in the middle of writing. Of course it shouldn't be writing to this memory at all. This fixes the issue. --- src/Sprites.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Sprites.cpp b/src/Sprites.cpp index 49a4ee0..e8a3439 100644 --- a/src/Sprites.cpp +++ b/src/Sprites.cpp @@ -285,19 +285,23 @@ void Sprites::drawBitmap(int16_t x, int16_t y, // FIRST PAGE - "ld %[data], %a[buffer_ofs]\n" // if sRow >= 0 "tst %[sRow]\n" - "brmi end_first_page\n" + "brmi skip_first_page\n" + "ld %[data], %a[buffer_ofs]\n" // then "com %A[mask_data]\n" "and %[data], %A[mask_data]\n" "or %[data], %A[bitmap_data]\n" - - "end_first_page:\n" // update buffer, increment "st %a[buffer_ofs]+, %[data]\n" + "jmp end_first_page\n" + "skip_first_page:\n" + // since no ST Z+ when skipped we need to do this manually + "adiw %[buffer_ofs], 1\n" + + "end_first_page:\n" // "x_loop_next:\n" "dec %[xi]\n"