Make sure strncpy always keeps one byte untouched for NUL
authorparasti <parasti@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Sat, 1 Aug 2009 20:30:59 +0000 (20:30 +0000)
committerparasti <parasti@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Sat, 1 Aug 2009 20:30:59 +0000 (20:30 +0000)
Otherwise things are bound to break on long input or when a buffer
higher up the chain gets increased for whatever reason.  (Yes, I don't
know why I have to think about this either.)

git-svn-id: https://s.snth.net/svn/neverball/trunk@2992 78b8d119-cf0a-0410-b17c-f493084dd1d7

ball/demo.c
ball/level.c
ball/score.c
ball/set.c
share/common.c
share/mapc.c

index 024a9f7..6619521 100644 (file)
@@ -140,12 +140,12 @@ struct demo *demo_load(const char *path)
 
     if ((fp = fs_open(path, "r")))
     {
-        d = malloc(sizeof (struct demo));
+        d = calloc(1, sizeof (struct demo));
 
         if (demo_header_read(fp, d))
         {
-            strncpy(d->filename, path, MAXSTR);
-            strncpy(d->name, base_name(d->filename, ".nbr"), PATHMAX);
+            strncpy(d->filename, path, MAXSTR - 1);
+            strncpy(d->name, base_name(d->filename, ".nbr"), PATHMAX - 1);
             d->name[PATHMAX - 1] = '\0';
         }
         else
@@ -289,8 +289,8 @@ int demo_play_init(const char *name, const struct level *level,
 
     strncpy(demo.player, config_get_s(CONFIG_PLAYER), sizeof (demo.player) - 1);
 
-    strncpy(demo.shot, level->shot, PATHMAX);
-    strncpy(demo.file, level->file, PATHMAX);
+    strncpy(demo.shot, level->shot, PATHMAX - 1);
+    strncpy(demo.file, level->file, PATHMAX - 1);
 
     demo.time   = t;
     demo.goal   = g;
@@ -454,10 +454,10 @@ int demo_replay_init(const char *name, int *g, int *m, int *b, int *s, int *tt)
 
     if (demo_fp && demo_header_read(demo_fp, &demo_replay))
     {
-        strncpy(demo_replay.filename, name, MAXSTR);
+        strncpy(demo_replay.filename, name, MAXSTR - 1);
         strncpy(demo_replay.name,
                 base_name(demo_replay.filename, ".nbr"),
-                PATHMAX);
+                PATHMAX - 1);
 
         if (level_load(demo_replay.file, &demo_level_replay))
         {
index 06623b2..c370c0d 100644 (file)
@@ -39,11 +39,11 @@ static void scan_level_attribs(struct level *l, const struct s_file *fp)
         char *v = fp->av + fp->dv[i].aj;
 
         if (strcmp(k, "message") == 0)
-            strncpy(l->message, v, MAXSTR);
+            strncpy(l->message, v, MAXSTR - 1);
         else if (strcmp(k, "song") == 0)
-            strncpy(l->song, v, PATHMAX);
+            strncpy(l->song, v, PATHMAX - 1);
         else if (strcmp(k, "shot") == 0)
-            strncpy(l->shot, v, PATHMAX);
+            strncpy(l->shot, v, PATHMAX - 1);
         else if (strcmp(k, "goal") == 0)
         {
             l->goal = atoi(v);
@@ -100,9 +100,9 @@ static void scan_level_attribs(struct level *l, const struct s_file *fp)
             }
         }
         else if (strcmp(k, "version") == 0)
-            strncpy(l->version, v, MAXSTR);
+            strncpy(l->version, v, MAXSTR - 1);
         else if (strcmp(k, "author") == 0)
-            strncpy(l->author, v, MAXSTR);
+            strncpy(l->author, v, MAXSTR - 1);
         else if (strcmp(k, "bonus") == 0)
             l->is_bonus = atoi(v) ? 1 : 0;
     }
@@ -293,9 +293,9 @@ void level_rename_player(int level,
 {
     struct level *l = get_level(level);
 
-    strncpy(l->score.best_times.player [time_rank], player, MAXNAM);
-    strncpy(l->score.fast_unlock.player[goal_rank], player, MAXNAM);
-    strncpy(l->score.most_coins.player [coin_rank], player, MAXNAM);
+    strncpy(l->score.best_times.player [time_rank], player, MAXNAM - 1);
+    strncpy(l->score.fast_unlock.player[goal_rank], player, MAXNAM - 1);
+    strncpy(l->score.most_coins.player [coin_rank], player, MAXNAM - 1);
 }
 
 /*---------------------------------------------------------------------------*/
index 7f37f60..6a4a683 100644 (file)
@@ -44,9 +44,9 @@ static void score_swap(struct score *S, int i, int j)
     char player[MAXNAM];
     int  tmp;
 
-    strncpy(player,       S->player[i], MAXNAM);
-    strncpy(S->player[i], S->player[j], MAXNAM);
-    strncpy(S->player[j], player,       MAXNAM);
+    strncpy(player,       S->player[i], MAXNAM - 1);
+    strncpy(S->player[i], S->player[j], MAXNAM - 1);
+    strncpy(S->player[j], player,       MAXNAM - 1);
 
     tmp         = S->timer[i];
     S->timer[i] = S->timer[j];
@@ -79,7 +79,7 @@ int score_time_insert(struct score *s, const char *player, int timer, int coins)
 {
     int i;
 
-    strncpy(s->player[3], player, MAXNAM);
+    strncpy(s->player[3], player, MAXNAM - 1);
     s->timer[3] = timer;
     s->coins[3] = coins;
 
@@ -93,7 +93,7 @@ int score_coin_insert(struct score *s, const char *player, int timer, int coins)
 {
     int i;
 
-    strncpy(s->player[3], player, MAXNAM);
+    strncpy(s->player[3], player, MAXNAM - 1);
     s->timer[3] = timer;
     s->coins[3] = coins;
 
index ed1244c..be17dc5 100644 (file)
@@ -492,8 +492,8 @@ void set_rename_player(int score_rank, int times_rank, const char *player)
 {
     struct set *s = SET_GET(sets, curr);
 
-    strncpy(s->coin_score.player[score_rank], player, MAXNAM);
-    strncpy(s->time_score.player[times_rank], player, MAXNAM);
+    strncpy(s->coin_score.player[score_rank], player, MAXNAM - 1);
+    strncpy(s->time_score.player[times_rank], player, MAXNAM - 1);
 }
 
 /*---------------------------------------------------------------------------*/
index 3da15c9..8ff4ea6 100644 (file)
@@ -256,7 +256,7 @@ char *base_name(const char *name, const char *suffix)
 
     base = path_last_sep(name);
 
-    strncpy(buf, base ? base + 1 : name, sizeof (buf));
+    strncpy(buf, base ? base + 1 : name, sizeof (buf) - 1);
 
     /* Remove the suffix. */
 
index b451cef..3117147 100644 (file)
@@ -2450,8 +2450,8 @@ static void dump_file(struct s_file *p, const char *name)
 
 int main(int argc, char *argv[])
 {
-    char src[MAXSTR];
-    char dst[MAXSTR];
+    char src[MAXSTR] = "";
+    char dst[MAXSTR] = "";
     struct s_file f;
     fs_file fin;
 
@@ -2468,8 +2468,8 @@ int main(int argc, char *argv[])
         if (argc > 3 && strcmp(argv[3], "--debug") == 0)
             debug_output = 1;
 
-        strncpy(src, argv[1], MAXSTR);
-        strncpy(dst, argv[1], MAXSTR);
+        strncpy(src, argv[1], MAXSTR - 1);
+        strncpy(dst, argv[1], MAXSTR - 1);
 
         if (strcmp(dst + strlen(dst) - 4, ".map") == 0)
             strcpy(dst + strlen(dst) - 4, ".sol");