diff options
Diffstat (limited to 'packaging/make-3.81-rlimit.patch')
-rw-r--r-- | packaging/make-3.81-rlimit.patch | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/packaging/make-3.81-rlimit.patch b/packaging/make-3.81-rlimit.patch new file mode 100644 index 0000000..f88f0fe --- /dev/null +++ b/packaging/make-3.81-rlimit.patch @@ -0,0 +1,111 @@ +diff -urp make-3.81/job.c make-3.81-pm/job.c +--- make-3.81/job.c 2008-03-25 18:15:38.000000000 +0100 ++++ make-3.81-pm/job.c 2008-03-25 17:51:11.000000000 +0100 +@@ -2079,6 +2079,9 @@ exec_command (char **argv, char **envp) + # else + + /* Run the program. */ ++#ifdef SET_STACK_SIZE ++ restore_original_stack_rlimit (); ++#endif + environ = envp; + execvp (argv[0], argv); + +diff -urp make-3.81/main.c make-3.81-pm/main.c +--- make-3.81/main.c 2008-03-25 18:15:38.000000000 +0100 ++++ make-3.81-pm/main.c 2008-03-25 18:14:04.000000000 +0100 +@@ -44,12 +44,53 @@ Foundation, Inc., 51 Franklin St, Fifth + # include <fcntl.h> + #endif + +-#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) +-# define SET_STACK_SIZE +-#endif +- + #ifdef SET_STACK_SIZE + # include <sys/resource.h> ++/* Whether the rlimit was set successfuly */ ++static int setrlimit_succeeded = 0; ++/* Original rlim_cur */ ++static rlim_t setrlimit_orig_cur = 0; ++ ++/* Get rid of any avoidable limit on stack size so that alloca does ++ not fail. */ ++void ++set_max_stack_rlimit (void) ++{ ++ struct rlimit rlim; ++ ++ /* Back off if the limit is still set, probably due to failure in ++ restore_original_stack_rlimit. */ ++ if (setrlimit_succeeded) ++ return; ++ ++ if (getrlimit (RLIMIT_STACK, &rlim) == 0) ++ { ++ setrlimit_orig_cur = rlim.rlim_cur; ++ rlim.rlim_cur = rlim.rlim_max; ++ if (setrlimit (RLIMIT_STACK, &rlim) != -1) ++ setrlimit_succeeded = 1; ++ } ++} ++ ++/* Set the rlimit back to its original value. To be called before ++ process spawn. */ ++void ++restore_original_stack_rlimit (void) ++{ ++ struct rlimit rlim; ++ ++ if (!setrlimit_succeeded) ++ return; ++ ++ if (getrlimit (RLIMIT_STACK, &rlim) == 0) ++ { ++ rlim.rlim_cur = setrlimit_orig_cur; ++ setrlimit (RLIMIT_STACK, &rlim); ++ /* Don't reset the setrlimit_succeeded flag. This can be called ++ after vfork, in which case the flag is in memory shared with ++ the parent. */ ++ } ++} + #endif + + #ifdef _AMIGA +@@ -915,17 +956,7 @@ main (int argc, char **argv, char **envp + #endif + + #ifdef SET_STACK_SIZE +- /* Get rid of any avoidable limit on stack size. */ +- { +- struct rlimit rlim; +- +- /* Set the stack limit huge so that alloca does not fail. */ +- if (getrlimit (RLIMIT_STACK, &rlim) == 0) +- { +- rlim.rlim_cur = rlim.rlim_max; +- setrlimit (RLIMIT_STACK, &rlim); +- } +- } ++ set_max_stack_rlimit (); + #endif + + #ifdef HAVE_ATEXIT +diff -urp make-3.81/make.h make-3.81-pm/make.h +--- make-3.81/make.h 2008-03-25 18:15:38.000000000 +0100 ++++ make-3.81-pm/make.h 2008-03-25 17:51:10.000000000 +0100 +@@ -346,6 +346,13 @@ extern int strcmpi (const char *,const c + #define N_(msgid) gettext_noop (msgid) + #define S_(msg1,msg2,num) ngettext (msg1,msg2,num) + ++/* Handle rlimit */ ++#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT) ++# define SET_STACK_SIZE ++void set_max_stack_rlimit (void); ++void restore_original_stack_rlimit (void); ++#endif ++ + /* Handle other OSs. */ + #if defined(HAVE_DOS_PATHS) + # define PATH_SEPARATOR_CHAR ';' +diff -urp make-3.81/w32/Makefile make-3.81-pm/w32/Makefile |