Ameliorate name-length hack
authorH.G.Muller <hgm@hgm-xboard.(none)>
Mon, 14 Dec 2015 12:52:43 +0000 (13:52 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Mon, 14 Dec 2015 12:52:43 +0000 (13:52 +0100)
Structs t_dirs and t_trees declared only a single character for the name
field, but were put in allocated memory so that it could harmlessly
overrun to the required size. On compilers that explicitly check for
buffer overruns this caused a crash. Now 100 char are declared, but the
actually allocated memory will be smaller (as small as before, and thus
still large enough to hold the actual name).

lasker-2.2.3/src/utils.c

index cee39f4..e301c2e 100644 (file)
@@ -647,16 +647,20 @@ char *ratstrii(int rat, int p)
   return tmp[on - 1];
 }
 
+#define OVERRUN 99
+
 struct t_tree {
   struct t_tree *left, *right;
-  char name;                   /* Not just 1 char - space for whole name */
+  char name[OVERRUN+1];         // [HGM] hack below caused crashing on some compilers
+//  char name;                 /* Not just 1 char - space for whole name */
 };                             /* is allocated.  Maybe a little cheesy? */
 
 struct t_dirs {
   struct t_dirs *left, *right;
   time_t mtime;                        /* dir's modification time */
   struct t_tree *files;
-  char name;                   /* ditto */
+  char name[OVERRUN+1];         // [HGM] ditto
+//  char name;                 /* ditto */
 };
 
 static char **t_buffer = NULL; /* pointer to next space in return buffer */
@@ -709,7 +713,7 @@ static void t_mft(struct t_dirs *d)
            t = &(*t)->right;
          }
        }
-       *t = malloc(sizeof(struct t_tree) + strlen(dp->d_name));
+       *t = malloc(sizeof(struct t_tree) - OVERRUN + strlen(dp->d_name));
        (*t)->right = (*t)->left = NULL;
        strcpy(&(*t)->name, dp->d_name);
       }
@@ -748,7 +752,7 @@ int search_directory(const char *dir, const char *filter, char **buffer, int buf
        i = &(*i)->right;
     }
     if (!*i) {                         /* if dir isn't in dir tree, add him */
-      *i = malloc(sizeof(struct t_dirs) + strlen(dir));
+      *i = malloc(sizeof(struct t_dirs) - OVERRUN + strlen(dir)); // [HGM] allocate just enough, even though struct promoised more
       (*i)->left = (*i)->right = NULL;
       (*i)->files = NULL;
       strcpy(&(*i)->name, dir);