Mapster32 corruptcheck: on nextsector/nextwall oob, suggest making wall white.

... in the auto-correction. Also,
- make two similar corruptions level 5 (wallptr oob, wallptr+wallnum oob).
- in drawscreen_drawwall(), do a more strict bound check, not only >=0.

git-svn-id: https://svn.eduke32.com/eduke32@3745 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2013-05-10 12:31:37 +00:00
parent c86bf550a5
commit 789e26b42f
2 changed files with 44 additions and 18 deletions

View File

@ -15665,7 +15665,7 @@ void draw2dgrid(int32_t posxe, int32_t posye, int32_t posze, int16_t cursectnum,
static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t posze, int32_t zoome, int32_t grayp)
{
const walltype *wal = &wall[i];
int32_t sect=0, j, x1, y1, x2, y2, dz = 0, dz2 = 0;
int32_t j, x1, y1, x2, y2, dz = 0, dz2 = 0;
int32_t fz=0,fzn=0;
// intptr_t tempint;
char col;
@ -15701,7 +15701,7 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
col = 33;
if ((wal->cstat&1) != 0)
col = 5;
if (wal->nextwall >= 0 && ((wal->cstat^wall[j].cstat)&1))
if ((unsigned)wal->nextwall < MAXWALLS && ((wal->cstat^wall[j].cstat)&1))
col = 2;
if ((i == linehighlight) || ((linehighlight >= 0) && (i == wall[linehighlight].nextwall)))
if (totalclock & 16)
@ -15734,7 +15734,7 @@ static void drawscreen_drawwall(int32_t i, int32_t posxe, int32_t posye, int32_t
{
// draw vertical line to neighboring wall
int32_t fz2;
sect = sectorofwall(i);
int32_t sect = sectorofwall(i);
fz = getflorzofslope(sect, wal->x,wal->y);
fz2 = getflorzofslope(sect, wall[wal->point2].x,wall[wal->point2].y);

View File

@ -11573,6 +11573,9 @@ static int32_t check_spritelist_consistency()
return 0;
}
#define TRYFIX_NONE() (tryfixing == 0ull)
#define TRYFIX_CNUM(onumct) (onumct < MAXCORRUPTTHINGS && (tryfixing & (1ull<<onumct)))
int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
{
int32_t i, j, w0, numw, endwall, ns, nw;
@ -11627,7 +11630,7 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
if (w0 < 0 || w0 >= MAXWALLS)
CORRUPTCHK_PRINT(5, CORRUPT_SECTOR|i, "SECTOR[%d].WALLPTR=%d INVALID!!!", i, w0);
else
CORRUPTCHK_PRINT(4, CORRUPT_SECTOR|i, "SECTOR[%d].WALLPTR=%d out of range (numwalls=%d)", i, w0, numw);
CORRUPTCHK_PRINT(5, CORRUPT_SECTOR|i, "SECTOR[%d].WALLPTR=%d out of range (numwalls=%d)", i, w0, numw);
}
if (w0 != ewall)
@ -11642,7 +11645,7 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
endwall = w0 + numw;
if (endwall > numwalls)
CORRUPTCHK_PRINT(4, CORRUPT_SECTOR|i, "SECTOR[%d]: wallptr+wallnum=%d out of range: numwalls=%d", i, endwall, numwalls);
CORRUPTCHK_PRINT(5, CORRUPT_SECTOR|i, "SECTOR[%d]: wallptr+wallnum=%d out of range: numwalls=%d", i, endwall, numwalls);
// inconsistent cstat&2 and heinum checker
{
@ -11697,26 +11700,49 @@ int32_t CheckMapCorruption(int32_t printfromlev, uint64_t tryfixing)
}
nw = wall[j].nextwall;
ns = wall[j].nextsector;
if (nw >= numwalls)
{
if (nw >= MAXWALLS)
CORRUPTCHK_PRINT(5, CORRUPT_WALL|j, "WALL[%d].NEXTWALL=%d INVALID!!!",
j, nw);
else
CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL[%d].NEXTWALL=%d out of range: numwalls=%d",
j, nw, numwalls);
int32_t onumct = numcorruptthings;
if (TRYFIX_NONE())
{
if (nw >= MAXWALLS)
CORRUPTCHK_PRINT(5, CORRUPT_WALL|j, "WALL[%d].NEXTWALL=%d INVALID!!!",
j, nw);
else
CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL[%d].NEXTWALL=%d out of range: numwalls=%d",
j, nw, numwalls);
OSD_Printf(" will make wall %d white on tryfix\n", j);
}
else if (TRYFIX_CNUM(onumct)) // CODEDUP MAKE_WALL_WHITE
{
wall[j].nextwall = wall[j].nextsector = -1;
OSD_Printf(CCHK_CORRECTED "auto-correction: made wall %d white\n", j);
}
}
ns = wall[j].nextsector;
if (ns >= numsectors)
{
if (ns >= MAXSECTORS)
CORRUPTCHK_PRINT(5, CORRUPT_WALL|j, "WALL[%d].NEXTSECTOR=%d INVALID!!!",
j, ns);
else
CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL[%d].NEXTSECTOR=%d out of range: numsectors=%d",
j, ns, numsectors);
int32_t onumct = numcorruptthings;
if (TRYFIX_NONE())
{
if (ns >= MAXSECTORS)
CORRUPTCHK_PRINT(5, CORRUPT_WALL|j, "WALL[%d].NEXTSECTOR=%d INVALID!!!",
j, ns);
else
CORRUPTCHK_PRINT(4, CORRUPT_WALL|j, "WALL[%d].NEXTSECTOR=%d out of range: numsectors=%d",
j, ns, numsectors);
OSD_Printf(" will make wall %d white on tryfix\n", j);
}
else if (TRYFIX_CNUM(onumct)) // CODEDUP MAKE_WALL_WHITE
{
wall[j].nextwall = wall[j].nextsector = -1;
OSD_Printf(CCHK_CORRECTED "auto-correction: made wall %d white\n", j);
}
}
if (nw>=w0 && nw<=endwall)