This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH][lto-plugin] Fix PR41550
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Cc: Diego Novillo <dnovillo at google dot com>, ccoutant at google dot com
- Date: Fri, 23 Apr 2010 17:05:17 +0200 (CEST)
- Subject: [PATCH][lto-plugin] Fix PR41550
This fixes PR41550, review comments for lto-plugin.
Tested on x86_64-unknown-linux-gnu, ok for trunk?
Thanks,
Richard.
2010-04-23 Richard Guenther <rguenther@suse.de>
PR lto/41550
* lto-plugin.c (parse_table_entry): Use xstrdup and xrealloc.
(translate): Likewise.
(all_symbols_read_handler): Likewise.
(claim_file_handler): Likewise.
(process_option): Likewise.
(add_output_files): Likewise. Remove filename length limit.
Index: lto-plugin/lto-plugin.c
===================================================================
*** lto-plugin/lto-plugin.c (revision 158665)
--- lto-plugin/lto-plugin.c (working copy)
*************** parse_table_entry (char *p, struct ld_pl
*** 140,146 ****
LDPV_HIDDEN
};
! entry->name = strdup (p);
while (*p)
p++;
p++;
--- 140,146 ----
LDPV_HIDDEN
};
! entry->name = xstrdup (p);
while (*p)
p++;
p++;
*************** parse_table_entry (char *p, struct ld_pl
*** 155,161 ****
if (strlen (entry->comdat_key) == 0)
entry->comdat_key = NULL;
else
! entry->comdat_key = strdup (entry->comdat_key);
t = *p;
check (t <= 4, LDPL_FATAL, "invalid symbol kind found");
--- 155,161 ----
if (strlen (entry->comdat_key) == 0)
entry->comdat_key = NULL;
else
! entry->comdat_key = xstrdup (entry->comdat_key);
t = *p;
check (t <= 4, LDPL_FATAL, "invalid symbol kind found");
*************** translate (Elf_Data *symtab, struct plug
*** 233,241 ****
while (data < end)
{
n++;
! syms = realloc (syms, n * sizeof (struct ld_plugin_symbol));
check (syms, LDPL_FATAL, "could not allocate memory");
! slots = realloc (slots, n * sizeof (uint32_t));
check (slots, LDPL_FATAL, "could not allocate memory");
data = parse_table_entry (data, &syms[n - 1], &slots[n - 1]);
}
--- 233,241 ----
while (data < end)
{
n++;
! syms = xrealloc (syms, n * sizeof (struct ld_plugin_symbol));
check (syms, LDPL_FATAL, "could not allocate memory");
! slots = xrealloc (slots, n * sizeof (uint32_t));
check (slots, LDPL_FATAL, "could not allocate memory");
data = parse_table_entry (data, &syms[n - 1], &slots[n - 1]);
}
*************** write_resolution (void)
*** 343,364 ****
static void
add_output_files (FILE *f)
{
- char fname[1000]; /* FIXME: Remove this restriction. */
-
for (;;)
{
size_t len;
- char *s = fgets (fname, sizeof (fname), f);
- if (!s)
- break;
len = strlen (s);
! check (s[len - 1] == '\n', LDPL_FATAL, "file name too long");
s[len - 1] = '\0';
num_output_files++;
! output_files = realloc (output_files, num_output_files * sizeof (char *));
! output_files[num_output_files - 1] = strdup (s);
add_input_file (output_files[num_output_files - 1]);
}
}
--- 343,370 ----
static void
add_output_files (FILE *f)
{
for (;;)
{
+ char *buf, *s = xmalloc (32);
size_t len;
+ buf = s;
+ cont:
+ if (!fgets (buf, 32, f))
+ break;
len = strlen (s);
! if (s[len - 1] != '\n')
! {
! s = xrealloc (s, len + 32);
! buf = s + len;
! goto cont;
! }
s[len - 1] = '\0';
num_output_files++;
! output_files
! = xrealloc (output_files, num_output_files * sizeof (char *));
! output_files[num_output_files - 1] = s;
add_input_file (output_files[num_output_files - 1]);
}
}
*************** all_symbols_read_handler (void)
*** 472,478 ****
return LDPS_OK;
}
! lto_argv = (char **) calloc (sizeof (char *), num_lto_args);
lto_arg_ptr = (const char **) lto_argv;
assert (lto_wrapper_argv);
--- 478,484 ----
return LDPS_OK;
}
! lto_argv = (char **) xcalloc (sizeof (char *), num_lto_args);
lto_arg_ptr = (const char **) lto_argv;
assert (lto_wrapper_argv);
*************** claim_file_handler (const struct ld_plug
*** 591,597 ****
}
else
{
! lto_file.name = strdup (file->name);
elf = elf_begin (file->fd, ELF_C_READ, NULL);
}
lto_file.handle = file->handle;
--- 597,603 ----
}
else
{
! lto_file.name = xstrdup (file->name);
elf = elf_begin (file->fd, ELF_C_READ, NULL);
}
lto_file.handle = file->handle;
*************** claim_file_handler (const struct ld_plug
*** 614,621 ****
*claimed = 1;
num_claimed_files++;
claimed_files =
! realloc (claimed_files,
! num_claimed_files * sizeof (struct plugin_file_info));
claimed_files[num_claimed_files - 1] = lto_file;
goto cleanup;
--- 620,627 ----
*claimed = 1;
num_claimed_files++;
claimed_files =
! xrealloc (claimed_files,
! num_claimed_files * sizeof (struct plugin_file_info));
claimed_files[num_claimed_files - 1] = lto_file;
goto cleanup;
*************** process_option (const char *option)
*** 642,659 ****
else if (!strncmp (option, "-pass-through=", strlen("-pass-through=")))
{
num_pass_through_items++;
! pass_through_items = realloc (pass_through_items,
! num_pass_through_items * sizeof (char *));
pass_through_items[num_pass_through_items - 1] =
! strdup (option + strlen ("-pass-through="));
}
else
{
int size;
lto_wrapper_num_args += 1;
size = lto_wrapper_num_args * sizeof (char *);
! lto_wrapper_argv = (char **) realloc (lto_wrapper_argv, size);
! lto_wrapper_argv[lto_wrapper_num_args - 1] = strdup(option);
}
}
--- 648,665 ----
else if (!strncmp (option, "-pass-through=", strlen("-pass-through=")))
{
num_pass_through_items++;
! pass_through_items = xrealloc (pass_through_items,
! num_pass_through_items * sizeof (char *));
pass_through_items[num_pass_through_items - 1] =
! xstrdup (option + strlen ("-pass-through="));
}
else
{
int size;
lto_wrapper_num_args += 1;
size = lto_wrapper_num_args * sizeof (char *);
! lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size);
! lto_wrapper_argv[lto_wrapper_num_args - 1] = xstrdup(option);
}
}