PR29892, Field file_table of struct module is uninitialized
authorAlan Modra <amodra@gmail.com>
Mon, 12 Dec 2022 08:31:08 +0000 (19:01 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 12 Dec 2022 08:55:19 +0000 (19:25 +1030)
PR 29892
* vms-alphs.c (new_module): Use bfd_zmalloc to alloc file_table.
(parse_module): Rewrite file_table reallocation code and clear.

bfd/vms-alpha.c

index 3b63259cc81df7f354bd6450ededdffdf862f625..6ee7060b0b2b39540ad554f5833cd39812cea12e 100644 (file)
@@ -4337,7 +4337,7 @@ new_module (bfd *abfd)
     = (struct module *) bfd_zalloc (abfd, sizeof (struct module));
   module->file_table_count = 16; /* Arbitrary.  */
   module->file_table
-    = bfd_malloc (module->file_table_count * sizeof (struct fileinfo));
+    = bfd_zmalloc (module->file_table_count * sizeof (struct fileinfo));
   return module;
 }
 
@@ -4520,15 +4520,18 @@ parse_module (bfd *abfd, struct module *module, unsigned char *ptr,
                       src_ptr + DST_S_B_SRC_DF_FILENAME,
                       ptr + rec_length - (src_ptr + DST_S_B_SRC_DF_FILENAME));
 
-                   while (fileid >= module->file_table_count)
+                   if (fileid >= module->file_table_count)
                      {
-                       module->file_table_count *= 2;
+                       unsigned int old_count = module->file_table_count;
+                       module->file_table_count += fileid;
                        module->file_table
                          = bfd_realloc_or_free (module->file_table,
                                                 module->file_table_count
                                                 * sizeof (struct fileinfo));
                        if (module->file_table == NULL)
                          return false;
+                       memset (module->file_table + old_count, 0,
+                               fileid * sizeof (struct fileinfo));
                      }
 
                    module->file_table [fileid].name = filename;