Skip to content

Commit b678dcc

Browse files
committed
Prevent writes outside buffer
1 parent 8786bc5 commit b678dcc

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

src/SFE_MicroOLED.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1066,23 +1066,29 @@ void MicroOLED::drawIcon(uint8_t offsetX, uint8_t offsetY, uint8_t iconWidth, ui
10661066
//If we have an offset, then straddle the bytes between rows
10671067
if (bitOffset)
10681068
{
1069+
10691070
//Zero out the bits before entering new data
10701071
if (overwrite == true)
10711072
{
10721073
screenmemory[byteNumber] &= ~(0xFF << bitOffset);
1073-
screenmemory[byteNumber + 64] &= ~(0xFF >> (8 - bitOffset));
1074+
if (byteNumber + 64 < (LCDHEIGHT * LCDWIDTH / 8)) //Prevent writes outside screenmemory
1075+
screenmemory[byteNumber + 64] &= ~(0xFF >> (8 - bitOffset));
10741076
}
10751077

10761078
//Write in new data across two rows
10771079
screenmemory[byteNumber] |= bitArray[i] << bitOffset;
1078-
screenmemory[byteNumber + 64] |= bitArray[i] >> (8 - bitOffset);
1080+
if (byteNumber + 64 < (LCDHEIGHT * LCDWIDTH / 8)) //Prevent writes outside screenmemory
1081+
screenmemory[byteNumber + 64] |= bitArray[i] >> (8 - bitOffset);
10791082
}
10801083
else //No shift needed
10811084
{
1082-
//Regular clear
1083-
if (overwrite == true)
1084-
screenmemory[byteNumber] = 0;
1085-
screenmemory[byteNumber] |= bitArray[i];
1085+
if (byteNumber < (LCDHEIGHT * LCDWIDTH) / 8) //Prevent writes outside screenmemory
1086+
{
1087+
//Regular clear
1088+
if (overwrite == true)
1089+
screenmemory[byteNumber] = 0;
1090+
screenmemory[byteNumber] |= bitArray[i];
1091+
}
10861092
}
10871093

10881094
columnNumber++;

0 commit comments

Comments
 (0)