From 2d99971a7fdf7f04cdaf32cdd11420046221e5e1 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Thu, 22 Jun 2006 17:10:26 +0000 Subject: [PATCH] (SCT_MAXDEF): Make it equal the maximum sector type, not the maximum plus one. Users changed. This indirectly fixes off-by-one loop bounds in budg(), show_sect_build(), show_sect_stats() and show_sect_capab(). The show bugs were harmless: the loops ran into the sentinel, which they ignore. The budg bug was serious: the loop ran into the entries for SCT_EFFIC. This lead to a bogus line in the budget, printing of a null pointer, and doubled sector build cost. Budget priorities masked this bug until rev. 1.25. --- include/sect.h | 4 ++-- src/lib/commands/budg.c | 4 ++-- src/lib/global/sect.c | 2 +- src/lib/update/main.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/sect.h b/include/sect.h index ba8288f4..5a06d9d7 100644 --- a/include/sect.h +++ b/include/sect.h @@ -151,9 +151,9 @@ struct dchrstr { #define SCT_ENLIST 31 /* enlistment center */ #define SCT_PLAINS 32 /* plains sector */ #define SCT_BTOWER 33 /* Bridge tower */ +#define SCT_MAXDEF 33 /* highest sector type in header files */ #define SCT_EFFIC 34 /* used in update & budget */ -#define SCT_MAXDEF 34 /* highest sector type in header files */ #define getsect(x, y, p) ef_read(EF_SECTOR, sctoff((x), (y)), (p)) #define putsect(p) ef_write(EF_SECTOR, sctoff((p)->sct_x, (p)->sct_y), (p)) @@ -163,7 +163,7 @@ struct dchrstr { /* things relating to sectors */ extern int sctoff(coord x, coord y); -extern struct dchrstr dchr[SCT_MAXDEF + 1]; +extern struct dchrstr dchr[SCT_MAXDEF + 2]; extern struct dchrstr bigcity_dchr; #define IS_BIG_CITY(type) (dchr[(type)].d_pkg == UPKG) diff --git a/src/lib/commands/budg.c b/src/lib/commands/budg.c index 39a51d82..41185eba 100644 --- a/src/lib/commands/budg.c +++ b/src/lib/commands/budg.c @@ -64,7 +64,7 @@ int budg(void) { int i; - long p_sect[SCT_MAXDEF+1][2]; + long p_sect[SCT_MAXDEF+2][2]; int taxes, Ncivs, Nuws, bars, Nbars, mil; int ships, sbuild, nsbuild, smaint; int units, lbuild, nlbuild, lmaint; @@ -198,7 +198,7 @@ calc_all(long p_sect[][2], int etu = etu_per_update; mil_dbl_pay = 0; - memset(p_sect, 0, sizeof(**p_sect) * (SCT_MAXDEF+1) * 2); + memset(p_sect, 0, sizeof(**p_sect) * (SCT_MAXDEF+2) * 2); *taxes = *Ncivs = *Nuws = *bars = *Nbars = *mil = 0; *ships = *sbuild = *nsbuild = *smaint = 0; *units = *lbuild = *nlbuild = *lmaint = 0; diff --git a/src/lib/global/sect.c b/src/lib/global/sect.c index e74d0b80..3e3aeb31 100644 --- a/src/lib/global/sect.c +++ b/src/lib/global/sect.c @@ -44,7 +44,7 @@ * Table of sector designations * Initialized on startup from sect.config and deity custom config (if any). */ -struct dchrstr dchr[SCT_MAXDEF + 1]; +struct dchrstr dchr[SCT_MAXDEF + 2]; /* * Table of infrastructure types diff --git a/src/lib/update/main.c b/src/lib/update/main.c index d225a46d..a17891fa 100644 --- a/src/lib/update/main.c +++ b/src/lib/update/main.c @@ -112,7 +112,7 @@ update_main(void *unused) logerror("done preparing sectors."); logerror("producing for countries..."); for (x = 0; x < MAXNOC; x++) { - long p_sect[SCT_MAXDEF+1][2]; + long p_sect[SCT_MAXDEF+2][2]; memset(p_sect, 0, sizeof(p_sect)); mil_dbl_pay = 0;