From aa5861d10b4250424d69a9e9d2decce7960f83ad Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Tue, 6 Jan 2009 17:22:26 -0600 Subject: [PATCH] Add standard checks to the assigning of a country name Add check to ensure a country by that name does not exist. Ensure the length is not too long. Note this is a change behaviour for edit and change commands which used to silently truncate long names. Enforce that a country name can not have control characters in it. Ensure that a country name is not blank or just spaces. --- include/nat.h | 1 + src/lib/commands/add.c | 6 ++---- src/lib/commands/chan.c | 24 +----------------------- src/lib/commands/edit.c | 4 +++- src/lib/subs/natsub.c | 37 +++++++++++++++++++++++++++++++++++++ 5 files changed, 44 insertions(+), 28 deletions(-) diff --git a/include/nat.h b/include/nat.h index 1e15fab5b..c35401ceb 100644 --- a/include/nat.h +++ b/include/nat.h @@ -177,6 +177,7 @@ extern void agecontact(struct natstr *np); extern int influx(struct natstr *np); extern struct natstr *nat_reset(struct natstr *, enum nat_status, coord, coord); +extern int check_nat_name(char *cname); extern int grant_btus(struct natstr *, int ); diff --git a/src/lib/commands/add.c b/src/lib/commands/add.c index a0add7001..3ba304bb7 100644 --- a/src/lib/commands/add.c +++ b/src/lib/commands/add.c @@ -84,12 +84,10 @@ add(void) } natp = getnatp(coun); p = getstarg(player->argp[2], "Country Name? ", buf); - if (p == 0 || *p == 0) + if (p ==0) return RET_SYN; - if (strlen(p) >= sizeof(cntryname)) { - pr("Country name too long\n"); + if (!check_nat_name(p)) return RET_FAIL; - } strcpy(cntryname, p); p = getstarg(player->argp[3], "Representative? ", buf); if (p == 0 || *p == 0) diff --git a/src/lib/commands/chan.c b/src/lib/commands/chan.c index 03da08d01..176b42380 100644 --- a/src/lib/commands/chan.c +++ b/src/lib/commands/chan.c @@ -33,7 +33,6 @@ #include -#include #include "commands.h" #include "news.h" #include "optlist.h" @@ -41,12 +40,8 @@ int chan(void) { - char *temp; - struct natstr *natp; char *p; - natid cn; int charge; - int nonb; int btucost; char buf[1024]; struct natstr *us; @@ -84,25 +79,8 @@ chan(void) if ((p = getstarg(player->argp[2], "New country name -- ", buf)) == 0) return RET_SYN; - p[sizeof(us->nat_cnam) - 1] = 0; - for (cn = 0; NULL != (natp = getnatp(cn)); cn++) { - if (!strcmp(p, natp->nat_cnam)) { - pr("Country #%d is already called `%s'!\n", cn, p); - return RET_FAIL; - } - } - nonb = 0; - for (temp = p; *temp != '\0'; temp++) { - if (iscntrl(*temp)) { - pr("No control characters allowed in country names!\n"); - return RET_FAIL; - } else if (*temp != ' ') - nonb = 1; - } - if (!nonb) { - pr("Must have a non-blank name!\n"); + if (!check_nat_name(p)) return RET_FAIL; - } player->dolcost += charge; player->btused += btucost; strcpy(us->nat_cnam, p); diff --git a/src/lib/commands/edit.c b/src/lib/commands/edit.c index e28b262c6..2ad13dac0 100644 --- a/src/lib/commands/edit.c +++ b/src/lib/commands/edit.c @@ -655,8 +655,10 @@ docountry(char op, int arg, char *p, struct natstr *np) switch (op) { case 'n': + if (!check_nat_name(p)) + return RET_SYN; pr("Country name changed from %s to %s\n", np->nat_cnam, p); - strncpy(np->nat_cnam, p, sizeof(np->nat_cnam) - 1); + strcpy(np->nat_cnam, p); break; case 'r': pr("Country representative changed from %s to %s\n", diff --git a/src/lib/subs/natsub.c b/src/lib/subs/natsub.c index 04c8e8dc9..8374ccb91 100644 --- a/src/lib/subs/natsub.c +++ b/src/lib/subs/natsub.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -41,6 +42,7 @@ #include "game.h" #include "nat.h" #include "optlist.h" +#include "prototypes.h" #include "tel.h" #include "xy.h" @@ -112,3 +114,38 @@ nat_reset(struct natstr *natp, enum nat_status stat, coord x, coord y) return natp; } + +int +check_nat_name(char *cname) +{ + struct natstr *natp; + natid cn; + int nonb; + char *temp; + + if (strlen(cname) >= sizeof(natp->nat_cnam)) { + pr("Country name too long\n"); + return 0; + } + + nonb = 0; + for (temp = cname; *temp != '\0'; temp++) { + if (iscntrl(*temp)) { + pr("No control characters allowed in country names!\n"); + return 0; + } else if (!isspace(*temp)) + nonb = 1; + } + if (!nonb) { + pr("Country name can't be all blank\n"); + return 0; + } + + for (cn = 0; NULL != (natp = getnatp(cn)); cn++) { + if (!strcmp(cname, natp->nat_cnam)) { + pr("Country #%d is already called `%s'\n", cn, cname); + return 0; + } + } + return 1; +} -- 2.43.0