Commit 0ad5835e by Ian Lance Taylor

If SMALL_ARG_MAX is defined don't pass non-directories in environment

From-SVN: r4278
parent 8f791f2d
...@@ -173,7 +173,7 @@ static char *concat (); ...@@ -173,7 +173,7 @@ static char *concat ();
static int do_spec (); static int do_spec ();
static int do_spec_1 (); static int do_spec_1 ();
static char *find_file (); static char *find_file ();
static int is_linker_dir (); static int is_directory ();
static void validate_switches (); static void validate_switches ();
static void validate_all_switches (); static void validate_all_switches ();
static void give_switch (); static void give_switch ();
...@@ -1438,7 +1438,8 @@ putenv_from_prefixes (paths, env_var) ...@@ -1438,7 +1438,8 @@ putenv_from_prefixes (paths, env_var)
{ {
int len = strlen (pprefix->prefix); int len = strlen (pprefix->prefix);
if (machine_suffix) if (machine_suffix
&& is_directory (pprefix->prefix, machine_suffix, 0))
{ {
if (!first_time) if (!first_time)
obstack_1grow (&collect_obstack, PATH_SEPARATOR); obstack_1grow (&collect_obstack, PATH_SEPARATOR);
...@@ -1448,7 +1449,9 @@ putenv_from_prefixes (paths, env_var) ...@@ -1448,7 +1449,9 @@ putenv_from_prefixes (paths, env_var)
obstack_grow (&collect_obstack, machine_suffix, suffix_len); obstack_grow (&collect_obstack, machine_suffix, suffix_len);
} }
if (just_machine_suffix && pprefix->require_machine_suffix == 2) if (just_machine_suffix
&& pprefix->require_machine_suffix == 2
&& is_directory (pprefix->prefix, just_machine_suffix, 0))
{ {
if (!first_time) if (!first_time)
obstack_1grow (&collect_obstack, PATH_SEPARATOR); obstack_1grow (&collect_obstack, PATH_SEPARATOR);
...@@ -2749,7 +2752,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) ...@@ -2749,7 +2752,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
#endif #endif
if (machine_suffix) if (machine_suffix)
{ {
if (is_linker_dir (pl->prefix, machine_suffix)) if (is_directory (pl->prefix, machine_suffix, 1))
{ {
do_spec_1 ("-L", 0, NULL_PTR); do_spec_1 ("-L", 0, NULL_PTR);
#ifdef SPACE_AFTER_L_OPTION #ifdef SPACE_AFTER_L_OPTION
...@@ -2771,7 +2774,7 @@ do_spec_1 (spec, inswitch, soft_matched_part) ...@@ -2771,7 +2774,7 @@ do_spec_1 (spec, inswitch, soft_matched_part)
} }
if (!pl->require_machine_suffix) if (!pl->require_machine_suffix)
{ {
if (is_linker_dir (pl->prefix, "")) if (is_directory (pl->prefix, "", 1))
{ {
do_spec_1 ("-L", 0, NULL_PTR); do_spec_1 ("-L", 0, NULL_PTR);
#ifdef SPACE_AFTER_L_OPTION #ifdef SPACE_AFTER_L_OPTION
...@@ -3515,13 +3518,16 @@ find_file (name) ...@@ -3515,13 +3518,16 @@ find_file (name)
return newname ? newname : name; return newname ? newname : name;
} }
/* Determine whether a -L option is relevant. Not required for certain /* Determine whether a directory exists. If LINKER, return 0 for
fixed names and for directories that don't exist. */ certain fixed names not needed by the linker. If not LINKER, it is
only important to return 0 if the host machine has a small ARG_MAX
limit. */
static int static int
is_linker_dir (path1, path2) is_directory (path1, path2, linker)
char *path1; char *path1;
char *path2; char *path2;
int linker;
{ {
int len1 = strlen (path1); int len1 = strlen (path1);
int len2 = strlen (path2); int len2 = strlen (path2);
...@@ -3529,6 +3535,11 @@ is_linker_dir (path1, path2) ...@@ -3529,6 +3535,11 @@ is_linker_dir (path1, path2)
char *cp; char *cp;
struct stat st; struct stat st;
#ifndef SMALL_ARG_MAX
if (! linker)
return 1;
#endif
/* Construct the path from the two parts. Ensure the string ends with "/.". /* Construct the path from the two parts. Ensure the string ends with "/.".
The resulting path will be a directory even if the given path is a The resulting path will be a directory even if the given path is a
symbolic link. */ symbolic link. */
...@@ -3541,8 +3552,9 @@ is_linker_dir (path1, path2) ...@@ -3541,8 +3552,9 @@ is_linker_dir (path1, path2)
*cp = '\0'; *cp = '\0';
/* Exclude directories that the linker is known to search. */ /* Exclude directories that the linker is known to search. */
if ((cp - path == 6 && strcmp (path, "/lib/.") == 0) if (linker
|| (cp - path == 10 && strcmp (path, "/usr/lib/.") == 0)) && ((cp - path == 6 && strcmp (path, "/lib/.") == 0)
|| (cp - path == 10 && strcmp (path, "/usr/lib/.") == 0)))
return 0; return 0;
return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode)); return (stat (path, &st) >= 0 && S_ISDIR (st.st_mode));
......
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