]> git.mxchange.org Git - quix0rs-blobwars.git/commitdiff
Add bounds checking to map->isFoo() functions.
authorGuus Sliepen <guus@debian.org>
Sat, 21 Nov 2015 15:12:41 +0000 (16:12 +0100)
committerGuus Sliepen <guus@debian.org>
Sat, 21 Nov 2015 15:12:41 +0000 (16:12 +0100)
The Address Sanitizer found a possible out of bounds read while playing
Blobwars:

src/CMap.cpp:147:15: runtime error: index 300 out of bounds for type 'unsigned char [300]'
src/CMap.cpp:117:16: runtime error: index 300 out of bounds for type 'unsigned char [300]'

src/CMap.cpp
src/CMap.h

index 5fc21e9c9b207084de307cc670095e9c866b8b18..aff505b148de898d249dec8651940b04386b5b17 100644 (file)
@@ -112,8 +112,19 @@ bool Map::isPracticeMission()
        return false;
 }
 
+bool Map::isValid(int x, int y)
+{
+       if (x >= 0 && y >= 0 && x < MAPWIDTH && y < MAPHEIGHT)
+               return true;
+
+       return false;
+}
+
 bool Map::isSolid(int x, int y)
 {
+       if (!isValid(x, y))
+               return false;
+
        if ((data[x][y] >= MAP_BREAKABLE) && (data[x][y] < MAP_DECORATION))
        {
                return true;
@@ -124,6 +135,9 @@ bool Map::isSolid(int x, int y)
 
 bool Map::isBreakable(int x, int y)
 {
+       if (!isValid(x, y))
+               return false;
+
        if ((data[x][y] >= MAP_BREAKABLE) && (data[x][y] <= MAP_BREAKABLE2))
        {
                return true;
@@ -134,6 +148,9 @@ bool Map::isBreakable(int x, int y)
 
 bool Map::isNoReset(int x, int y)
 {
+       if (!isValid(x, y))
+               return false;
+
        if ((data[x][y] >= MAP_NORESET) && (data[x][y] < MAP_DECORATION))
        {
                return true;
@@ -144,6 +161,9 @@ bool Map::isNoReset(int x, int y)
 
 bool Map::isLiquid(int x, int y)
 {
+       if (!isValid(x, y))
+               return false;
+
        if (data[x][y] == 0)
        {
                return false;
@@ -162,6 +182,9 @@ bool Map::isLiquid(int x, int y)
 
 bool Map::isTopLayer(int x, int y)
 {
+       if (!isValid(x, y))
+               return false;
+
        if (data[x][y] >= MAP_TOPLAYER)
        {
                return true;
index 3a60d004f951456fdba23d6bf6bd05c6a793b205..dd9632c0a296b4fa7c6370c27a956e4c23c8aadc 100644 (file)
@@ -91,6 +91,7 @@ class Map {
        void destroy();
        
        bool isPracticeMission();
+       bool isValid(int x, int y);
        bool isSolid(int x, int y);
        bool isBreakable(int x, int y);
        bool isNoReset(int x, int y);