]> granicus.if.org Git - nethack/commitdiff
Add Strlen(), a strlen(3) that panics if string is stupid long and returns unsigned.
authornhkeni <keni@his.com>
Mon, 7 Mar 2022 01:23:04 +0000 (20:23 -0500)
committernhkeni <keni@his.com>
Thu, 17 Mar 2022 01:34:21 +0000 (21:34 -0400)
First batch of changes to use it to suppress warnings.

16 files changed:
include/extern.h
src/botl.c
src/cmd.c
src/eat.c
src/end.c
src/engrave.c
src/hacklib.c
src/invent.c
src/nhlua.c
src/o_init.c
src/objnam.c
src/role.c
src/save.c
src/sp_lev.c
src/topten.c
src/weapon.c

index 1138db340a99dfac736caa8e7d3a5a4901f6e198..fa7cc5fab468b7e1006a3fb44bac8b4704a7a1a2 100644 (file)
@@ -968,6 +968,7 @@ extern char *strip_newline(char *);
 extern char *stripchars(char *, const char *, const char *);
 extern char *stripdigits(char *);
 extern char *eos(char *);
+extern unsigned Strlen(const char *);
 extern boolean str_end_is(const char *, const char *);
 extern int str_lines_maxlen(const char *);
 extern char *strkitten(char *, char);
index f12b106f413a7ff484568cb59df532b8158264e5..4e6af91503e3deb4b3e0fd56689d6a09750000d0 100644 (file)
@@ -368,7 +368,7 @@ title_to_mon(const char *str, int *rank_indx, int *title_length)
                 if (rank_indx)
                     *rank_indx = j;
                 if (title_length)
-                    *title_length = strlen(roles[i].rank[j].m);
+                    *title_length = Strlen(roles[i].rank[j].m);
                 return roles[i].mnum;
             }
             if (roles[i].rank[j].f
@@ -376,7 +376,7 @@ title_to_mon(const char *str, int *rank_indx, int *title_length)
                 if (rank_indx)
                     *rank_indx = j;
                 if (title_length)
-                    *title_length = strlen(roles[i].rank[j].f);
+                    *title_length = Strlen(roles[i].rank[j].f);
                 return roles[i].mnum;
             }
         }
index b22d68fbd4bf9d635e46abaa5c429f5c00504068..32ac3e1c610d8aa50cbb01c7823a2954a0d0cdca 100644 (file)
--- a/src/cmd.c
+++ b/src/cmd.c
@@ -2550,7 +2550,7 @@ extcmds_match(const char *findstr, int ecmflags, int **matchlist)
 {
     static int retmatchlist[SIZE(extcmdlist)] = DUMMY;
     int i, mi = 0;
-    int fslen = findstr ? strlen(findstr) : 0;
+    int fslen = findstr ? Strlen(findstr) : 0;
     boolean ignoreac = (ecmflags & ECM_IGNOREAC) != 0;
     boolean exactmatch = (ecmflags & ECM_EXACTMATCH) != 0;
     boolean no1charcmd = (ecmflags & ECM_NO1CHARCMD) != 0;
index 2b464802da49f94613fe1a41a3c15d38b29760e4..1985ecd14dffd20d7f552ef7cae904efd8dcc48f 100644 (file)
--- a/src/eat.c
+++ b/src/eat.c
@@ -176,9 +176,10 @@ eatmupdate(void)
 
     if (altmsg) {
         /* replace end-of-mimicking message */
-        if (strlen(altmsg) > strlen(g.eatmbuf)) {
+        int amlen = Strlen(altmsg);
+        if (amlen > Strlen(g.eatmbuf)) {
             free((genericptr_t) g.eatmbuf);
-            g.eatmbuf = (char *) alloc(strlen(altmsg) + 1);
+            g.eatmbuf = (char *) alloc(amlen + 1);
         }
         g.nomovemsg = strcpy(g.eatmbuf, altmsg);
         /* update current image */
index c3b371613e9e6d18f37256bf11c7d5add771eb5e..0fcd8798d6d4de45bd9427d6acb50e6b971cbe47 100644 (file)
--- a/src/end.c
+++ b/src/end.c
@@ -1423,7 +1423,7 @@ really_done(int how)
 
         corpse = mk_named_object(CORPSE, &mons[mnum], u.ux, u.uy, g.plname);
         Sprintf(pbuf, "%s, ", g.plname);
-        formatkiller(eos(pbuf), sizeof pbuf - strlen(pbuf), how, TRUE);
+        formatkiller(eos(pbuf), sizeof pbuf - Strlen(pbuf), how, TRUE);
         make_grave(u.ux, u.uy, pbuf);
     }
     pbuf[0] = '\0'; /* clear grave text; also lint suppression */
index 7b9573781bf0f11031bdb2c1f77218314727b8bc..9e6384cb23dbfae3a935ffe446ddf3330422dc5c 100644 (file)
@@ -388,7 +388,7 @@ void
 make_engr_at(int x, int y, const char *s, long e_time, xchar e_type)
 {
     struct engr *ep;
-    unsigned smem = strlen(s) + 1;
+    unsigned smem = Strlen(s) + 1;
 
     if ((ep = engr_at(x, y)) != 0)
         del_engr(ep);
index 84856a1c9fb21639032922b7d4dc93d3ec6078e4..33f01c904f1e8a14a41e247096113cf12ef21b6b 100644 (file)
@@ -24,6 +24,7 @@
         char *          strip_newline   (char *)
         char *          stripchars      (char *, const char *, const char *)
         char *          stripdigits     (char *)
+       unsigned        Strlen          (const char *str)
         char *          eos             (char *)
         boolean         str_end_is      (const char *, const char *)
         int             str_lines_maxlen (const char *)
@@ -228,6 +229,16 @@ eos(register char *s)
     return s;
 }
 
+/* like strlen(3) but returns unsigned and panics if string is unreasonably long */
+unsigned
+Strlen(const char *str){
+    size_t len = strnlen(str, LARGEST_INT);
+
+    if (len == LARGEST_INT)
+       panic("string too long");
+    return (unsigned) len;
+}
+
 /* determine whether 'str' ends in 'chkstr' */
 boolean
 str_end_is(const char *str, const char *chkstr)
index 1ff07a2d40df023aef3dc47890d56a1558c1e3e5..ac82b220623852dd5b14a94936f66d12441f06bf 100644 (file)
@@ -3985,8 +3985,8 @@ let_to_name(char let, boolean unpaid, boolean showsym)
     else
         class_name = names[0];
 
-    len = strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof "")
-          + (oclass ? (strlen(ocsymfmt) + invbuf_sympadding) : 0);
+    len = Strlen(class_name) + (unpaid ? sizeof "unpaid_" : sizeof "")
+          + (oclass ? (Strlen(ocsymfmt) + invbuf_sympadding) : 0);
     if (len > g.invbufsiz) {
         if (g.invbuf)
             free((genericptr_t) g.invbuf);
@@ -3999,7 +3999,7 @@ let_to_name(char let, boolean unpaid, boolean showsym)
         Strcpy(g.invbuf, class_name);
     if ((oclass != 0) && showsym) {
         char *bp = eos(g.invbuf);
-        int mlen = invbuf_sympadding - strlen(class_name);
+        int mlen = invbuf_sympadding - Strlen(class_name);
         while (--mlen > 0) {
             *bp = ' ';
             bp++;
index ad8eb7756bdee3e28b95a9847ac9261263f67e05..8c3ad0f61fc6f486a96f7b326f04348a90ffd768 100644 (file)
@@ -1382,7 +1382,7 @@ nhl_loadlua(lua_State *L, const char *fname)
     long buflen, ct, cnt;
     int llret;
 
-    altfname = (char *) alloc(strlen(fname) + 3); /* 3: '('...')\0' */
+    altfname = (char *) alloc(Strlen(fname) + 3); /* 3: '('...')\0' */
     /* don't know whether 'fname' is inside a dlb container;
        if we did, we could choose between "nhdat(<fname>)" and "<fname>"
        but since we don't, compromise */
index bea7c6a75e001e965a54877394d19ce7173a21cd..143db6170b97af01d1ef485e0ebeda50d22a19f9 100644 (file)
@@ -383,7 +383,7 @@ savenames(NHFILE* nhfp)
     for (i = 0; i < NUM_OBJECTS; i++)
         if (objects[i].oc_uname) {
             if (perform_bwrite(nhfp)) {
-                len = strlen(objects[i].oc_uname) + 1;
+                len = Strlen(objects[i].oc_uname) + 1;
                 if (nhfp->structlevel) {
                     bwrite(nhfp->fd, (genericptr_t)&len, sizeof len);
                     bwrite(nhfp->fd, (genericptr_t)objects[i].oc_uname, len);
index 28a3fc3d199b2bc73c7093d86c075b6b70812130..8a63159c3a748e0b71aad5c76c54938f93cfce30 100644 (file)
@@ -402,7 +402,7 @@ fruit_from_name(
     if (!exact) {
         tentativef = 0;
         for (f = g.ffruit; f; f = f->nextf) {
-            k = strlen(f->fname);
+            k = Strlen(f->fname);
             if (!strncmp(f->fname, fname, k)
                 && (!fname[k] || fname[k] == ' ')
                 && (!tentativef || k > strlen(tentativef->fname)))
@@ -422,11 +422,11 @@ fruit_from_name(
     }
     if (!f && !exact) {
         char fnamebuf[BUFSZ], *p;
-        unsigned fname_k = strlen(fname); /* length of assumed plural fname */
+        unsigned fname_k = Strlen(fname); /* length of assumed plural fname */
 
         tentativef = 0;
         for (f = g.ffruit; f; f = f->nextf) {
-            k = strlen(f->fname);
+            k = Strlen(f->fname);
             /* reload fnamebuf[] each iteration in case it gets modified;
                there's no need to recalculate fname_k */
             Strcpy(fnamebuf, fname);
@@ -441,7 +441,7 @@ fruit_from_name(
             if (fname_k >= k && (p = index(&fnamebuf[k], ' ')) != 0) {
                 *p = '\0'; /* truncate at 1st space past length of f->fname */
                 altfname = makesingular(fnamebuf);
-                k = strlen(altfname); /* actually revised 'fname_k' */
+                k = Strlen(altfname); /* actually revised 'fname_k' */
                 if (!strcmp(f->fname, altfname)
                     && (!tentativef || k > strlen(tentativef->fname)))
                     tentativef = f;
@@ -1976,7 +1976,7 @@ yobjnam(struct obj* obj, const char *verb)
     if (!carried(obj) || !obj_is_pname(obj)
         || obj->oartifact >= ART_ORB_OF_DETECTION) {
         char *outbuf = shk_your(nextobuf(), obj);
-        int space_left = BUFSZ - 1 - strlen(outbuf);
+        int space_left = BUFSZ - 1 - Strlen(outbuf);
 
         s = strncat(outbuf, s, space_left);
     }
@@ -2050,7 +2050,7 @@ yname(struct obj* obj)
     if (!carried(obj) || !obj_is_pname(obj)
         || obj->oartifact >= ART_ORB_OF_DETECTION) {
         char *outbuf = shk_your(nextobuf(), obj);
-        int space_left = BUFSZ - 1 - strlen(outbuf);
+        int space_left = BUFSZ - 1 - Strlen(outbuf);
 
         s = strncat(outbuf, s, space_left);
     }
@@ -2077,7 +2077,7 @@ ysimple_name(struct obj* obj)
 {
     char *outbuf = nextobuf();
     char *s = shk_your(outbuf, obj); /* assert( s == outbuf ); */
-    int space_left = BUFSZ - 1 - strlen(s);
+    int space_left = BUFSZ - 1 - Strlen(s);
 
     return strncat(s, minimal_xname(obj), space_left);
 }
@@ -2273,7 +2273,7 @@ vtense(const char* subj, const char* verb)
             /* check for special cases to avoid false matches */
             len = (int) (spot - subj) + 1;
             for (spec = special_subjs; *spec; spec++) {
-                ltmp = strlen(*spec);
+                ltmp = Strlen(*spec);
                 if (len == ltmp && !strncmpi(*spec, subj, len))
                     goto sing;
                 /* also check for <prefix><space><special_subj>
@@ -2377,7 +2377,7 @@ const char *const *alt_as_is) /* another set like as_is[] */
     const struct sing_plur *sp;
     const char *same, *other, *const *as;
     int al;
-    int baselen = strlen(basestr);
+    int baselen = Strlen(basestr);
 
     for (as = as_is; *as; ++as) {
         al = (int) strlen(*as);
@@ -2555,7 +2555,7 @@ makeplural(const char* oldstr)
     *(spot + 1) = '\0';
     /* Now spot is the last character of the string */
 
-    len = strlen(str);
+    len = Strlen(str);
 
     /* Single letters */
     if (len == 1 || !letter(*spot)) {
@@ -4118,7 +4118,7 @@ readobjnam_postparse1(struct _readobjnam_data *d)
         && strncmpi(d->bp, "food ration", 11)
         && strncmpi(d->bp, "meat ring", 9))
         for (i = 0; i < (int) (sizeof wrpsym); i++) {
-            register int j = strlen(wrp[i]);
+            register int j = Strlen(wrp[i]);
 
             /* check for "<class> [ of ] something" */
             if (!strncmpi(d->bp, wrp[i], j)) {
index 5f95e952aab76a49878ab7c7cf41850cfbfba4d1..cd3dedbe39eda00e408b537384dfaf128c2130d5 100644 (file)
@@ -748,7 +748,7 @@ str2role(const char *str)
         return ROLE_NONE;
 
     /* Match as much of str as is provided */
-    len = strlen(str);
+    len = Strlen(str);
     for (i = 0; roles[i].name.m; i++) {
         /* Does it match the male name? */
         if (!strncmpi(str, roles[i].name.m, len))
@@ -878,7 +878,7 @@ str2gend(const char *str)
         return ROLE_NONE;
 
     /* Match as much of str as is provided */
-    len = strlen(str);
+    len = Strlen(str);
     for (i = 0; i < ROLE_GENDERS; i++) {
         /* Does it match the adjective? */
         if (!strncmpi(str, genders[i].adj, len))
@@ -941,7 +941,7 @@ str2align(const char *str)
         return ROLE_NONE;
 
     /* Match as much of str as is provided */
-    len = strlen(str);
+    len = Strlen(str);
     for (i = 0; i < ROLE_ALIGNS; i++) {
         /* Does it match the adjective? */
         if (!strncmpi(str, aligns[i].adj, len))
@@ -1530,7 +1530,7 @@ build_plselection_prompt(
         Strcat(tmpbuf, "a ");
     /* <your> */
 
-    (void) root_plselection_prompt(eos(tmpbuf), buflen - strlen(tmpbuf),
+    (void) root_plselection_prompt(eos(tmpbuf), buflen - Strlen(tmpbuf),
                                    rolenum, racenum, gendnum, alignnum);
     /* "Shall I pick a character's role, race, gender, and alignment for you?"
        plus " [ynaq] (y)" is a little too long for a conventional 80 columns;
index cf3ee9116be921e91c41f6f8f6b462445e68ed30..2c0a94acbae3c8452e9347a6bb67c73126132cdf 100644 (file)
@@ -243,7 +243,7 @@ save_gamelog(NHFILE *nhfp)
         tmp2 = tmp->next;
         if (perform_bwrite(nhfp)) {
             if (nhfp->structlevel) {
-                slen = strlen(tmp->text);
+                slen = Strlen(tmp->text);
                 bwrite(nhfp->fd, (genericptr_t) &slen, sizeof slen);
                 bwrite(nhfp->fd, (genericptr_t) tmp->text, slen);
                 bwrite(nhfp->fd, (genericptr_t) tmp,
index 5303d2c9619fc243d8907afe8aa7016d882c9aec..fb7f60b72b6591948562ae463668d12e476b9728 100644 (file)
@@ -2906,8 +2906,8 @@ lspo_message(lua_State *L)
 
     msg = luaL_checkstring(L, 1);
 
-    old_n = g.lev_message ? (strlen(g.lev_message) + 1) : 0;
-    n = strlen(msg);
+    old_n = g.lev_message ? (Strlen(g.lev_message) + 1) : 0;
+    n = Strlen(msg);
 
     levmsg = (char *) alloc(old_n + n + 1);
     if (old_n)
index 3847317823f1ce929d8f0c42c371c3843b5e0d87..a5f50ae795abe24c0a66a2b30bd85876f6bf80d5 100644 (file)
@@ -117,7 +117,7 @@ formatkiller(
         /*FALLTHRU*/
     case KILLED_BY:
         (void) strncat(buf, killed_by_prefix[how], siz - 1);
-        l = strlen(buf);
+        l = Strlen(buf);
         buf += l, siz -= l;
         break;
     }
index 935e9f058005745b415f6eb0aec4d1f0c9070306..4c158abe9df7c97d70f9ff5a50951234cb8e3590 100644 (file)
@@ -1170,7 +1170,7 @@ enhance_weapon_skill(void)
         for (longest = 0, i = 0; i < P_NUM_SKILLS; i++) {
             if (P_RESTRICTED(i))
                 continue;
-            if ((len = strlen(P_NAME(i))) > longest)
+            if ((len = Strlen(P_NAME(i))) > longest)
                 longest = len;
             if (can_advance(i, speedy))
                 to_advance++;