From f965d3dad7edb527e465d7d2811294177daee53c Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Thu, 7 Jul 2016 14:03:39 +0200 Subject: [PATCH] Prevent LTO wrappers to process a recursive execution * file-find.c (remove_prefix): New function. * file-find.h (remove_prefix): Declare the function. * gcc-ar.c (main): Skip a folder of the wrapper if a wrapped binary would point to the same file. From-SVN: r238089 --- gcc/ChangeLog | 7 +++++++ gcc/file-find.c | 35 +++++++++++++++++++++++++++++++++++ gcc/file-find.h | 1 + gcc/gcc-ar.c | 8 ++++++++ 4 files changed, 51 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fca1bac78e4..c3d63275775 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-07-07 Martin Liska + + * file-find.c (remove_prefix): New function. + * file-find.h (remove_prefix): Declare the function. + * gcc-ar.c (main): Skip a folder of the wrapper if + a wrapped binary would point to the same file. + 2016-07-07 Jan Hubicka * tree-scalar-evolution.c (iv_can_overflow_p): export. diff --git a/gcc/file-find.c b/gcc/file-find.c index 289ef28de12..1066da9395a 100644 --- a/gcc/file-find.c +++ b/gcc/file-find.c @@ -208,3 +208,38 @@ prefix_from_string (const char *p, struct path_prefix *pprefix) } free (nstore); } + +void +remove_prefix (const char *prefix, struct path_prefix *pprefix) +{ + struct prefix_list *remove, **prev, **remove_prev = NULL; + int max_len = 0; + + if (pprefix->plist) + { + prev = &pprefix->plist; + for (struct prefix_list *pl = pprefix->plist; pl->next; pl = pl->next) + { + if (strcmp (prefix, pl->prefix) == 0) + { + remove = pl; + remove_prev = prev; + continue; + } + + int l = strlen (pl->prefix); + if (l > max_len) + max_len = l; + + prev = &pl; + } + + if (remove_prev) + { + *remove_prev = remove->next; + free (remove); + } + + pprefix->max_len = max_len; + } +} diff --git a/gcc/file-find.h b/gcc/file-find.h index 5ad9a5f44c6..19a4746be09 100644 --- a/gcc/file-find.h +++ b/gcc/file-find.h @@ -41,6 +41,7 @@ extern void find_file_set_debug (bool); extern char *find_a_file (struct path_prefix *, const char *, int); extern void add_prefix (struct path_prefix *, const char *); extern void add_prefix_begin (struct path_prefix *, const char *); +extern void remove_prefix (const char *prefix, struct path_prefix *); extern void prefix_from_env (const char *, struct path_prefix *); extern void prefix_from_string (const char *, struct path_prefix *); diff --git a/gcc/gcc-ar.c b/gcc/gcc-ar.c index 45ba3617ff3..a02dccb8000 100644 --- a/gcc/gcc-ar.c +++ b/gcc/gcc-ar.c @@ -194,6 +194,14 @@ main (int ac, char **av) #ifdef CROSS_DIRECTORY_STRUCTURE real_exe_name = concat (target_machine, "-", PERSONALITY, NULL); #endif + /* Do not search original location in the same folder. */ + char *exe_folder = lrealpath (av[0]); + exe_folder[strlen (exe_folder) - strlen (lbasename (exe_folder))] = '\0'; + char *location = concat (exe_folder, PERSONALITY, NULL); + + if (access (location, X_OK) == 0) + remove_prefix (exe_folder, &path); + exe_name = find_a_file (&path, real_exe_name, X_OK); if (!exe_name) { -- 2.30.2