dump: Properly handle more than 1024 categories.
authorBen Pfaff <blp@cs.stanford.edu>
Tue, 28 Jul 2015 02:43:02 +0000 (19:43 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Tue, 28 Jul 2015 02:43:02 +0000 (19:43 -0700)
dump.c

diff --git a/dump.c b/dump.c
index 45ae0d86534f2d6ff4b91a3378182b73d7598e73..aeb26086b0d1e3de00f956700181efb37610e801 100644 (file)
--- a/dump.c
+++ b/dump.c
@@ -548,7 +548,7 @@ check_permutation(int *a, int n, const char *name)
 }
 
 static void
-dump_category(int level, int *indexes, int *n_indexes)
+dump_category(int level, int *indexes, int *n_indexes, int max_indexes)
 {
   for (int i = 0; i <= level; i++)
     fprintf (stdout, "    ");
@@ -579,6 +579,11 @@ dump_category(int level, int *indexes, int *n_indexes)
           fprintf(stderr, "index not -1 but subcategories\n");
           exit(1);
         }
+      if (*n_indexes >= max_indexes)
+        {
+          fprintf(stderr, "too many categories (increase max_indexes)\n");
+          exit(1);
+        }
       indexes[(*n_indexes)++] = indx;
     }
   if (n_categories == 0)
@@ -588,7 +593,7 @@ dump_category(int level, int *indexes, int *n_indexes)
       fprintf (stdout, "<category-index>%d</category-index>\n", indx);
     }
   for (int i = 0; i < n_categories; i++)
-    dump_category (level + 1, indexes, n_indexes);
+    dump_category (level + 1, indexes, n_indexes, max_indexes);
   for (int i = 0; i <= level; i++)
     fprintf (stdout, "    ");
   printf ("</category>\n");
@@ -617,10 +622,10 @@ dump_dim(int indx)
   match_u32_assert(indx);
   n_categories = get_u32();
 
-  int indexes[1024];
+  int indexes[2048];
   int n_indexes = 0;
   for (int i = 0; i < n_categories; i++)
-    dump_category (0, indexes, &n_indexes);
+    dump_category (0, indexes, &n_indexes, sizeof indexes / sizeof *indexes);
   check_permutation(indexes, n_indexes, "categories");
 
   fprintf (stdout, "</dimension>\n");