This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);
      }
  }
  


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]