aboutsummaryrefslogtreecommitdiff
path: root/libiberty/argv.c
diff options
context:
space:
mode:
authornickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-13 11:36:38 +0000
committernickc <nickc@138bc75d-0d04-0410-961f-82ee72b054a4>2010-08-13 11:36:38 +0000
commit26ac88be1deb9001f80d8d31495eefcefda57b73 (patch)
tree9deb5559b40c2d1f4edda2b6b8c4073edbe5ede0 /libiberty/argv.c
parent1bbeed5840a38a0c01703e34451c226d2ba46557 (diff)
* argv.c (expandargv): Limit the number of times that response
files are opened in order to prevent infinite recursion. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@163222 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libiberty/argv.c')
-rw-r--r--libiberty/argv.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/libiberty/argv.c b/libiberty/argv.c
index 3084248b96c..8476c8fda9e 100644
--- a/libiberty/argv.c
+++ b/libiberty/argv.c
@@ -1,5 +1,5 @@
/* Create and destroy argument vectors (argv's)
- Copyright (C) 1992, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1992, 2001, 2010 Free Software Foundation, Inc.
Written by Fred Fish @ Cygnus Support
This file is part of the libiberty library.
@@ -386,6 +386,9 @@ expandargv (int *argcp, char ***argvp)
int i = 0;
/* Non-zero if ***argvp has been dynamically allocated. */
int argv_dynamic = 0;
+ /* Limit the number of response files that we parse in order
+ to prevent infinite recursion. */
+ unsigned int iteration_limit = 2000;
/* Loop over the arguments, handling response files. We always skip
ARGVP[0], as that is the name of the program being run. */
while (++i < *argcp)
@@ -412,6 +415,12 @@ expandargv (int *argcp, char ***argvp)
filename = (*argvp)[i];
if (filename[0] != '@')
continue;
+ /* If we have iterated too many times then stop. */
+ if (-- iteration_limit == 0)
+ {
+ fprintf (stderr, "%s: error: too many @-files encountered\n", (*argvp)[0]);
+ xexit (1);
+ }
/* Read the contents of the file. */
f = fopen (++filename, "r");
if (!f)