From 2377b3cd523535bfa6bb171d8ed11eefcc6a7a22 Mon Sep 17 00:00:00 2001 From: Andrew Chin Date: Thu, 7 Feb 2013 19:44:56 -0500 Subject: [PATCH] Fixed nether rendering crash The nether rendering mode was not properly handling x and z values outside of the range 0 to 15. This was causing an out-of-bounds segfault when accessing the remove_block array. Fixes #881 Fixes #851 Fixes #852 --- overviewer_core/src/overviewer.h | 2 +- overviewer_core/src/primitives/nether.c | 12 ++++++------ overviewer_core/src/primitives/nether.h | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/overviewer_core/src/overviewer.h b/overviewer_core/src/overviewer.h index 23ff5fa..e20c15f 100644 --- a/overviewer_core/src/overviewer.h +++ b/overviewer_core/src/overviewer.h @@ -26,7 +26,7 @@ // increment this value if you've made a change to the c extesion // and want to force users to rebuild -#define OVERVIEWER_EXTENSION_VERSION 41 +#define OVERVIEWER_EXTENSION_VERSION 42 /* Python PIL, and numpy headers */ #include diff --git a/overviewer_core/src/primitives/nether.c b/overviewer_core/src/primitives/nether.c index 0cc6706..671fd5f 100644 --- a/overviewer_core/src/primitives/nether.c +++ b/overviewer_core/src/primitives/nether.c @@ -23,20 +23,20 @@ walk_chunk(RenderState *state, RenderPrimitiveNether *data) { int x, y, z; int id; - for (x = 0; x < WIDTH; x++) { - for (z = 0; z < DEPTH; z++) { + for (x = -1; x < WIDTH + 1; x++) { + for (z = -1; z < DEPTH + 1; z++) { id = get_data(state, BLOCKS, x, NETHER_ROOF - (state->chunky * 16), z); if (id == 7) { - data->remove_block[x][NETHER_ROOF][z] = 1; + data->remove_block[x+1][NETHER_ROOF][z+1] = 1; id = get_data(state, BLOCKS, x, (NETHER_ROOF + 1) - (state->chunky * 16), z); if (id == 39 || id == 40) - data->remove_block[x][NETHER_ROOF + 1][z] = 1; + data->remove_block[x+1][NETHER_ROOF + 1][z+1] = 1; } for (y = NETHER_ROOF-1; y>=0; y--) { id = get_data(state, BLOCKS, x, y - (state->chunky * 16), z); if (id == 7 || id == 87) - data->remove_block[x][y][z] = 1; + data->remove_block[x+1][y][z+1] = 1; else break; } @@ -56,7 +56,7 @@ nether_hidden(void *data, RenderState *state, int x, int y, int z) { walk_chunk(state, self); real_y = y + (state->chunky * 16); - return self->remove_block[x][real_y][z]; + return self->remove_block[x+1][real_y][z+1]; } RenderPrimitiveInterface primitive_nether = { diff --git a/overviewer_core/src/primitives/nether.h b/overviewer_core/src/primitives/nether.h index 73ae26e..72c898f 100644 --- a/overviewer_core/src/primitives/nether.h +++ b/overviewer_core/src/primitives/nether.h @@ -22,9 +22,11 @@ #define DEPTH 16 #define HEIGHT 256 +// add two to these because the primative functions should expect to +// deal with x and z values of -1 and 16 typedef struct { int walked_chunk; - int remove_block[WIDTH][HEIGHT][DEPTH]; + int remove_block[WIDTH+2][HEIGHT][DEPTH+2]; } RenderPrimitiveNether;