Commit ed0f0c0f by Richard Guenther Committed by Richard Biener

re PR lto/41550 (Fix security and portability issues in lto-plugin)

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.

From-SVN: r158673
parent 4e708ff7
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.
2010-04-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> 2010-04-02 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* Makefile.in: Regenerate. * Makefile.in: Regenerate.
......
...@@ -140,7 +140,7 @@ parse_table_entry (char *p, struct ld_plugin_symbol *entry, uint32_t *slot) ...@@ -140,7 +140,7 @@ parse_table_entry (char *p, struct ld_plugin_symbol *entry, uint32_t *slot)
LDPV_HIDDEN LDPV_HIDDEN
}; };
entry->name = strdup (p); entry->name = xstrdup (p);
while (*p) while (*p)
p++; p++;
p++; p++;
...@@ -155,7 +155,7 @@ parse_table_entry (char *p, struct ld_plugin_symbol *entry, uint32_t *slot) ...@@ -155,7 +155,7 @@ parse_table_entry (char *p, struct ld_plugin_symbol *entry, uint32_t *slot)
if (strlen (entry->comdat_key) == 0) if (strlen (entry->comdat_key) == 0)
entry->comdat_key = NULL; entry->comdat_key = NULL;
else else
entry->comdat_key = strdup (entry->comdat_key); entry->comdat_key = xstrdup (entry->comdat_key);
t = *p; t = *p;
check (t <= 4, LDPL_FATAL, "invalid symbol kind found"); check (t <= 4, LDPL_FATAL, "invalid symbol kind found");
...@@ -233,9 +233,9 @@ translate (Elf_Data *symtab, struct plugin_symtab *out) ...@@ -233,9 +233,9 @@ translate (Elf_Data *symtab, struct plugin_symtab *out)
while (data < end) while (data < end)
{ {
n++; n++;
syms = realloc (syms, n * sizeof (struct ld_plugin_symbol)); syms = xrealloc (syms, n * sizeof (struct ld_plugin_symbol));
check (syms, LDPL_FATAL, "could not allocate memory"); check (syms, LDPL_FATAL, "could not allocate memory");
slots = realloc (slots, n * sizeof (uint32_t)); slots = xrealloc (slots, n * sizeof (uint32_t));
check (slots, LDPL_FATAL, "could not allocate memory"); check (slots, LDPL_FATAL, "could not allocate memory");
data = parse_table_entry (data, &syms[n - 1], &slots[n - 1]); data = parse_table_entry (data, &syms[n - 1], &slots[n - 1]);
} }
...@@ -343,22 +343,29 @@ write_resolution (void) ...@@ -343,22 +343,29 @@ write_resolution (void)
static void static void
add_output_files (FILE *f) add_output_files (FILE *f)
{ {
char fname[1000]; /* FIXME: Remove this restriction. */
for (;;) for (;;)
{ {
const unsigned piece = 32;
char *buf, *s = xmalloc (piece);
size_t len; size_t len;
char *s = fgets (fname, sizeof (fname), f);
if (!s)
break;
buf = s;
cont:
if (!fgets (buf, piece, f))
break;
len = strlen (s); len = strlen (s);
check (s[len - 1] == '\n', LDPL_FATAL, "file name too long"); if (s[len - 1] != '\n')
{
s = xrealloc (s, len + piece);
buf = s + len;
goto cont;
}
s[len - 1] = '\0'; s[len - 1] = '\0';
num_output_files++; num_output_files++;
output_files = realloc (output_files, num_output_files * sizeof (char *)); output_files
output_files[num_output_files - 1] = strdup (s); = xrealloc (output_files, num_output_files * sizeof (char *));
output_files[num_output_files - 1] = s;
add_input_file (output_files[num_output_files - 1]); add_input_file (output_files[num_output_files - 1]);
} }
} }
...@@ -472,7 +479,7 @@ all_symbols_read_handler (void) ...@@ -472,7 +479,7 @@ all_symbols_read_handler (void)
return LDPS_OK; return LDPS_OK;
} }
lto_argv = (char **) calloc (sizeof (char *), num_lto_args); lto_argv = (char **) xcalloc (sizeof (char *), num_lto_args);
lto_arg_ptr = (const char **) lto_argv; lto_arg_ptr = (const char **) lto_argv;
assert (lto_wrapper_argv); assert (lto_wrapper_argv);
...@@ -591,7 +598,7 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed) ...@@ -591,7 +598,7 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
} }
else else
{ {
lto_file.name = strdup (file->name); lto_file.name = xstrdup (file->name);
elf = elf_begin (file->fd, ELF_C_READ, NULL); elf = elf_begin (file->fd, ELF_C_READ, NULL);
} }
lto_file.handle = file->handle; lto_file.handle = file->handle;
...@@ -614,8 +621,8 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed) ...@@ -614,8 +621,8 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
*claimed = 1; *claimed = 1;
num_claimed_files++; num_claimed_files++;
claimed_files = claimed_files =
realloc (claimed_files, xrealloc (claimed_files,
num_claimed_files * sizeof (struct plugin_file_info)); num_claimed_files * sizeof (struct plugin_file_info));
claimed_files[num_claimed_files - 1] = lto_file; claimed_files[num_claimed_files - 1] = lto_file;
goto cleanup; goto cleanup;
...@@ -642,18 +649,18 @@ process_option (const char *option) ...@@ -642,18 +649,18 @@ process_option (const char *option)
else if (!strncmp (option, "-pass-through=", strlen("-pass-through="))) else if (!strncmp (option, "-pass-through=", strlen("-pass-through=")))
{ {
num_pass_through_items++; num_pass_through_items++;
pass_through_items = realloc (pass_through_items, pass_through_items = xrealloc (pass_through_items,
num_pass_through_items * sizeof (char *)); num_pass_through_items * sizeof (char *));
pass_through_items[num_pass_through_items - 1] = pass_through_items[num_pass_through_items - 1] =
strdup (option + strlen ("-pass-through=")); xstrdup (option + strlen ("-pass-through="));
} }
else else
{ {
int size; int size;
lto_wrapper_num_args += 1; lto_wrapper_num_args += 1;
size = lto_wrapper_num_args * sizeof (char *); size = lto_wrapper_num_args * sizeof (char *);
lto_wrapper_argv = (char **) realloc (lto_wrapper_argv, size); lto_wrapper_argv = (char **) xrealloc (lto_wrapper_argv, size);
lto_wrapper_argv[lto_wrapper_num_args - 1] = strdup(option); lto_wrapper_argv[lto_wrapper_num_args - 1] = xstrdup(option);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment