aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2016-07-07 12:03:39 +0000
committerMartin Liska <mliska@suse.cz>2016-07-07 12:03:39 +0000
commit81c76140169c35fc2b672dffc145ad0da8dc9a94 (patch)
tree9776d8d0e93b2015a8b4ebed34c65d2f6e684da5
parent2518f284020b3d33dc63d0bc59a5e5f0963f114e (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@238089 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/file-find.c35
-rw-r--r--gcc/file-find.h1
-rw-r--r--gcc/gcc-ar.c8
4 files changed, 51 insertions, 0 deletions
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 <mliska@suse.cz>
+
+ * 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 <jh@suse.cz>
* 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)
{