Improve memory safety in light of newer compiler warnings
authorAri Johnson <ari@theari.com>
Wed, 7 Dec 2022 23:53:54 +0000 (18:53 -0500)
committerAri Johnson <ari@theari.com>
Wed, 7 Dec 2022 23:53:54 +0000 (18:53 -0500)
src/bsd.c
src/conf.c
src/db.c
src/extchat.c
src/fundb.c
src/funstr.c
src/game.c
src/ident.c
src/pcre.c
src/prog.c

index 49ea6a418c858145b913f320b6cb28456976efa5..93bbe2679422b15411eea16c79cb9575eacb3be0 100644 (file)
--- a/src/bsd.c
+++ b/src/bsd.c
@@ -880,7 +880,7 @@ static const char *empabb(dbref player) {
 
 
 bad_empabb_value:
-        strncpy(str, "---", 3);
+        strncpy(str, "---", 4);
         return str;
 }
 
index c32aa369a6e8d0c4b873376ee1cd2850aeee530a..0782ae4c5afd1216cd98be0bd7a549295de51f5c 100644 (file)
@@ -812,6 +812,7 @@ cf_flag(const char *opt, const char *val, void *loc, int maxval, int source)
 {
   size_t len = strlen(val);
   size_t total = strlen((char *) loc);
+  char temp[BUFFER_LEN];
 
   /* truncate if necessary */
   if (len + total + 1 >= (size_t) maxval) {
@@ -824,7 +825,8 @@ cf_flag(const char *opt, const char *val, void *loc, int maxval, int source)
     if (source == 0)
       do_rawlog(LT_ERR, T("CONFIG: option %s value truncated\n"), opt);
   }
-  sprintf((char *) loc, "%s %s", (char *) loc, val);
+  snprintf(temp, sizeof temp, "%s %s", (char *) loc, val);
+  strncpy(loc, temp, maxval);
   return 1;
 }
 
index 94dd9cd32e73f38b0e068ff83c992ce7acbc2675..7b38e532e441756225e28a6d219c0fe07456228f 100644 (file)
--- a/src/db.c
+++ b/src/db.c
@@ -860,7 +860,7 @@ db_paranoid_write_object(FILE * f, dbref i, int flag)
        count = 0;
        do {
          name[BUFFER_LEN - 6] = '\0';
-         sprintf(tbuf1, "%s%d", name, count);
+         snprintf(tbuf1, sizeof tbuf1, "%.1018s%d", name, count);
          count++;
        } while (count < 10000 && atr_get_noparent(i, tbuf1));
        strcpy(name, tbuf1);
index 3f2a4615ed5dda8a55d16c4e26b3d0890954c2e0..c4abdffeac3f1e5f5a0a8fb00fdd655dce40f9d4 100644 (file)
@@ -3088,16 +3088,20 @@ const char *
 channel_description(dbref player)
 {
   static char buf[BUFFER_LEN];
+  char *bp;
   CHANLIST *c;
 
-  *buf = '\0';
+  bp = buf;
 
   if (Chanlist(player)) {
-    strcpy(buf, T("Channels:"));
+    safe_str(T("Channels:"), buf, &bp);
     for (c = Chanlist(player); c; c = c->next)
-      sprintf(buf, "%s %s", buf, ChanName(c->chan));
+      safe_chr(' ', buf, &bp);
+      safe_str(ChanName(c->chan), buf, &bp);
   } else if (IsPlayer(player))
-    strcpy(buf, T("Channels: *NONE*"));
+    safe_str(T("Channels: *NONE*"), buf, &bp);
+
+  *bp = '\0';
   return buf;
 }
 
index d25821a87eb1b3a9cda5a3f60a9cc2e068705a07..3fabecf6efcca9b80b2aef7bb05b59d16208a55b 100644 (file)
@@ -1891,7 +1891,7 @@ FUNCTION(fun_link)
     safe_str(T(e_perm), buff, bp);
     return;
   }
-  do_link(executor, args[0], args[1], args[2] && args[2] != '\0' ? parse_boolean(args[2]) : 0 );
+  do_link(executor, args[0], args[1], args[2] && *args[2] != '\0' ? parse_boolean(args[2]) : 0 );
 }
 
 /* ARGSUSED */
index 69d8a32249efdeff9a68fffb80bb794f2174414f..00af11bfaf63a3ebb0c5b05138836dbfea8b3821 100644 (file)
@@ -2153,7 +2153,7 @@ FUNCTION(fun_speak)
   ENTER_OOREF;
 
   if (nargs > 3) {
-    if (args[3] != '\0') {
+    if (*args[3] != '\0') {
       /* we have a transform attr */
       transform = 1;
       if (!fetch_ufun_attrib(args[3], executor, &transufun, 1)) {
@@ -2162,7 +2162,7 @@ FUNCTION(fun_speak)
        return;
       }
       if (nargs > 4) {
-       if (args[4] != '\0') {
+       if (*args[4] != '\0') {
          /* we have an attr to use when transform returns an empty string */
          null = 1;
          if (!fetch_ufun_attrib(args[4], executor, &nullufun, 1)) {
@@ -2175,11 +2175,11 @@ FUNCTION(fun_speak)
     }
   }
 
-  if (nargs < 6 || args[5] == '\0')
+  if (nargs < 6 || *args[5] == '\0')
     open = (char *) "\"";
   else
     open = args[5];
-  if (nargs < 7 || args[6] == '\0')
+  if (nargs < 7 || *args[6] == '\0')
     close = open;
   else
     close = args[6];
index 0ed5c1561cf8a059315ae5adb6d033b9590bceb7..55c06cd19978e30453eb9415ebb74594bdc08cb8 100644 (file)
@@ -358,9 +358,11 @@ dump_database_internal(void)
       paranoid_checkpt = 1;
 #endif
     if(options.flagdb[0] != '\0') {
-      sprintf(realdumpfile, "%s%s", options.flagdb, options.compresssuff);
+      snprintf(realdumpfile, sizeof realdumpfile, "%.1790s%s", options.flagdb,
+              options.compresssuff);
       strcpy(tmpfl, make_new_epoch_file(options.flagdb, epoch));
-      sprintf(realtmpfl, "%s%s", tmpfl, options.compresssuff);
+      snprintf(realtmpfl, sizeof realtmpfl, "%.1790s%s", tmpfl,
+              options.compresssuff);
       if((f = db_open_write(tmpfl)) != NULL) {
        use_flagfile = 1;
        db_write_flag_db(f);
@@ -378,9 +380,11 @@ dump_database_internal(void)
       }
     }
 
-    sprintf(realdumpfile, "%s%s", globals.dumpfile, options.compresssuff);
+    snprintf(realdumpfile, sizeof realdumpfile, "%.1790s%s", globals.dumpfile,
+            options.compresssuff);
     strcpy(tmpfl, make_new_epoch_file(globals.dumpfile, epoch));
-    sprintf(realtmpfl, "%s%s", tmpfl, options.compresssuff);
+    snprintf(realtmpfl, sizeof realtmpfl, "%.1790s%s", tmpfl,
+            options.compresssuff);
 
     if ((f = db_open_write(tmpfl)) != NULL) {
       switch (globals.paranoid_dump) {
@@ -412,9 +416,11 @@ dump_database_internal(void)
       longjmp(db_err, 1);
     }
 #ifdef USE_MAILER
-    sprintf(realdumpfile, "%s%s", options.mail_db, options.compresssuff);
+    snprintf(realdumpfile, sizeof realdumpfile, "%.1790s%s", options.mail_db,
+            options.compresssuff);
     strcpy(tmpfl, make_new_epoch_file(options.mail_db, epoch));
-    sprintf(realtmpfl, "%s%s", tmpfl, options.compresssuff);
+    snprintf(realtmpfl, sizeof realtmpfl, "%.1790s%s", tmpfl,
+            options.compresssuff);
     if (mdb_top >= 0) {
       if ((f = db_open_write(tmpfl)) != NULL) {
        dump_mail(f);
@@ -433,9 +439,11 @@ dump_database_internal(void)
     }
 #endif
 #ifdef CHAT_SYSTEM 
-    sprintf(realdumpfile, "%s%s", options.chatdb, options.compresssuff);
+    snprintf(realdumpfile, sizeof realdumpfile, "%.1790s%s", options.chatdb,
+            options.compresssuff);
     strcpy(tmpfl, make_new_epoch_file(options.chatdb, epoch));
-    sprintf(realtmpfl, "%s%s", tmpfl, options.compresssuff);
+    snprintf(realtmpfl, sizeof realtmpfl, "%.1790s%s", tmpfl,
+            options.compresssuff);
     if ((f = db_open_write(tmpfl)) != NULL) {
       save_chatdb(f);
       db_close(f);
index 0ee9f5825b40b0696ac25ef8e260be8b30d2df6e..21be8badf080cc050cab50ada53d68544142a94e 100644 (file)
@@ -334,7 +334,7 @@ id_query(ident_t * id, struct sockaddr *laddr, socklen_t llen,
   getnameinfo(faddr, flen, NULL, 0, port, sizeof(port),
              NI_NUMERICHOST | NI_NUMERICSERV);
   strncat(buf, port, sizeof(buf));
-  strncat(buf, "\r\n", sizeof(buf));
+  strncat(buf, "\r\n", sizeof(buf) - 1);
 
   if (timeout) {
     time_t now, after;
index 6d66d2ed64c38ed7dd382c04f90bb7bb1e0bbcbd..5c24c2102804035553de0be4b925485d052826b9 100644 (file)
@@ -1821,7 +1821,7 @@ the pcre module can use all the optimization it can get). */
              for (c = 0; c < 16; c++)
                start_bits[c] |= tcode[c];
              for (c = 128; c < 256; c++) {
-               if ((tcode[c / 8] && (1 << (c & 7))) != 0) {
+               if (tcode[c / 8] && ((1 << (c & 7)) != 0)) {
                  int d = (c >> 6) | 0xc0;      /* Set bit for this starter */
                  start_bits[d / 8] |= (1 << (d & 7));  /* and then skip on to the */
                  c = (c & 0xc0) + 0x40 - 1;    /* next relevant character. */
index 8f185f69fbed609b78f43cbd689484a476d2de21..9415bf74af3fb2486f14f4a63a019f912d5ab176 100644 (file)
@@ -682,13 +682,13 @@ prog_load_desc(DESC * d)
     *rbp = '\0';
     if (PromptConnection(d)) {
       if (ShowAnsiColor(d->player))
-        snprintf(buf, BUFFER_LEN - 1, "%s %c%c", rbuf, IAC, GOAHEAD);
+        snprintf(buf, BUFFER_LEN - 1, "%.2045s %c%c", rbuf, IAC, GOAHEAD);
       else
-        snprintf(buf, BUFFER_LEN - 1, "%s %c%c",
+        snprintf(buf, BUFFER_LEN - 1, "%.2045s %c%c",
                  remove_markup(rbuf, NULL), IAC, GOAHEAD);
     } else {
       if (ShowAnsiColor(d->player))
-        snprintf(buf, BUFFER_LEN - 1, "%s\r\n", rbuf);
+        snprintf(buf, BUFFER_LEN - 1, "%.2045s\r\n", rbuf);
       else
         snprintf(buf, BUFFER_LEN - 1, "%s\r\n", remove_markup(rbuf, NULL));
     }