World-sized bitmaps were allocated with size WORLD_SZ() / 8, which
expands to (WORLD_X * WORLD_Y / 2) / 8. The divisions truncate unless
WORLD_X * WORLD_Y is a multiple of 16. The bitmaps were one byte too
small then. Bitmap overruns happen when:
* A lookout looks at one of the last sectors of the sector file.
Besides commands look and llook, this affects navigate and march
sub-command 'l'.
* Command spy spies into one of the last sectors of the sector file.
* A map or nmap (but not a bmap) shows one of the last sectors of the
sector file, or a sector that can see one of the last sectors
(visual range is two sectors at 100% efficiency). Besides commands
lmap, map, nmap, pmap, smap, this affects move and transport
sub-command 'm'.
Diagnosed with valgrind.
Already broken in BSD Empire 1.1 (bitmaps were on the stack then).
if (!snxtitem(&ni, type, player->argp[1], NULL))
return RET_SYN;
if (!snxtitem(&ni, type, player->argp[1], NULL))
return RET_SYN;
- bitmap = calloc(WORLD_SZ() / 8, 1);
+ bitmap = calloc((WORLD_SZ() + 7) / 8, 1);
if (!bitmap) {
logerror("malloc failed in do_look\n");
pr("Memory error. Tell the deity.\n");
if (!bitmap) {
logerror("malloc failed in do_look\n");
pr("Memory error. Tell the deity.\n");
* Known contributors to this file:
* Dave Pare, 1986
* Steve McClure, 1998-2000
* Known contributors to this file:
* Dave Pare, 1986
* Steve McClure, 1998-2000
- * Markus Armbruster, 2005-2008
+ * Markus Armbruster, 2005-2011
pr("You don't have the BTU's for spying on that scale!\n");
return RET_FAIL;
}
pr("You don't have the BTU's for spying on that scale!\n");
return RET_FAIL;
}
- bitmap = calloc(WORLD_SZ() / 8, 1);
+ bitmap = calloc((WORLD_SZ() + 7) / 8, 1);
if (!bitmap) {
logerror("malloc failed in do_look\n");
pr("Memory error. Tell the deity.\n");
if (!bitmap) {
logerror("malloc failed in do_look\n");
pr("Memory error. Tell the deity.\n");
* Known contributors to this file:
* Ken Stevens, 1995
* Steve McClure, 1998
* Known contributors to this file:
* Ken Stevens, 1995
* Steve McClure, 1998
- * Markus Armbruster, 2004-2008
+ * Markus Armbruster, 2004-2011
* Ron Koenderink, 2006
*/
* Ron Koenderink, 2006
*/
- bitmap = malloc(WORLD_SZ() / 8);
+ bitmap = malloc((WORLD_SZ() + 7) / 8);
if (!wmapbuf || !wmap || !bitmap) {
pr("Memory error, tell the deity.\n");
logerror("malloc failed in draw_map\n");
if (!wmapbuf || !wmap || !bitmap) {
pr("Memory error, tell the deity.\n");
logerror("malloc failed in draw_map\n");
struct sctstr sect;
if (!player->god) {
struct sctstr sect;
if (!player->god) {
- memset(bitmap, 0, WORLD_SZ() / 8);
+ memset(bitmap, 0, (WORLD_SZ() + 7) / 8);
bitinit2(nsp, bitmap, player->cnum);
}
while (nxtsct(nsp, §) && !player->aborted) {
bitinit2(nsp, bitmap, player->cnum);
}
while (nxtsct(nsp, §) && !player->aborted) {
int changed = 0;
if (!player->god) {
int changed = 0;
if (!player->god) {
- memset(bitmap, 0, WORLD_SZ() / 8);
+ memset(bitmap, 0, (WORLD_SZ() + 7) / 8);
bitinit2(nsp, bitmap, player->cnum);
}
while (nxtsct(nsp, §) && !player->aborted) {
bitinit2(nsp, bitmap, player->cnum);
}
while (nxtsct(nsp, §) && !player->aborted) {