2a3871a
diff -Burp make-3.81/job.c make-3.81-pm/job.c
2a3871a
--- make-3.81/job.c	2006-11-30 11:00:23.000000000 +0100
2a3871a
+++ make-3.81-pm/job.c	2006-11-30 10:58:46.000000000 +0100
2a3871a
@@ -2079,6 +2079,9 @@ exec_command (char **argv, char **envp)
2a3871a
 # else
2a3871a
 
2a3871a
   /* Run the program.  */
2a3871a
+#ifdef SET_STACK_SIZE
2a3871a
+  restore_original_stack_rlimit ();
2a3871a
+#endif
2a3871a
   environ = envp;
2a3871a
   execvp (argv[0], argv);
2a3871a
 
2a3871a
diff -Burp make-3.81/main.c make-3.81-pm/main.c
2a3871a
--- make-3.81/main.c	2006-11-30 11:00:23.000000000 +0100
2a3871a
+++ make-3.81-pm/main.c	2006-11-30 10:38:04.000000000 +0100
2a3871a
@@ -44,12 +44,51 @@ Foundation, Inc., 51 Franklin St, Fifth 
2a3871a
 # include <fcntl.h>
2a3871a
 #endif
2a3871a
 
2a3871a
-#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT)
2a3871a
-# define SET_STACK_SIZE
2a3871a
-#endif
2a3871a
-
2a3871a
 #ifdef SET_STACK_SIZE
2a3871a
 # include <sys/resource.h>
2a3871a
+/* Whether the rlimit was set successfuly */
2a3871a
+static int setrlimit_succeeded = 0;
2a3871a
+/* Original rlim_cur */
2a3871a
+static rlim_t setrlimit_orig_cur = 0;
2a3871a
+
2a3871a
+/* Get rid of any avoidable limit on stack size so that alloca does
2a3871a
+   not fail. */
2a3871a
+void
2a3871a
+set_max_stack_rlimit (void)
2a3871a
+{
2a3871a
+  struct rlimit rlim;
2a3871a
+
2a3871a
+  /* Back off if the limit is still set, probably due to failure in
2a3871a
+     restore_original_stack_rlimit. */
2a3871a
+  if (setrlimit_succeeded)
2a3871a
+    return;
2a3871a
+
2a3871a
+  if (getrlimit (RLIMIT_STACK, &rlim) == 0)
2a3871a
+    {
2a3871a
+      setrlimit_orig_cur = rlim.rlim_cur;
2a3871a
+      rlim.rlim_cur = rlim.rlim_max;
2a3871a
+      if (setrlimit (RLIMIT_STACK, &rlim) != -1)
2a3871a
+	setrlimit_succeeded = 1;
2a3871a
+    }
2a3871a
+}
2a3871a
+
2a3871a
+/* Set the rlimit back to its original value.  To be called before
2a3871a
+   process spawn. */
2a3871a
+void
2a3871a
+restore_original_stack_rlimit (void)
2a3871a
+{
2a3871a
+  struct rlimit rlim;
2a3871a
+
2a3871a
+  if (!setrlimit_succeeded)
2a3871a
+    return;
2a3871a
+
2a3871a
+  if (getrlimit (RLIMIT_STACK, &rlim) == 0)
2a3871a
+    {
2a3871a
+      rlim.rlim_cur = setrlimit_orig_cur;
2a3871a
+      if (setrlimit (RLIMIT_STACK, &rlim) != -1)
2a3871a
+	setrlimit_succeeded = 0;
2a3871a
+    }
2a3871a
+}
2a3871a
 #endif
2a3871a
 
2a3871a
 #ifdef _AMIGA
2a3871a
@@ -915,17 +954,7 @@ main (int argc, char **argv, char **envp
2a3871a
 #endif
2a3871a
 
2a3871a
 #ifdef SET_STACK_SIZE
2a3871a
- /* Get rid of any avoidable limit on stack size.  */
2a3871a
-  {
2a3871a
-    struct rlimit rlim;
2a3871a
-
2a3871a
-    /* Set the stack limit huge so that alloca does not fail.  */
2a3871a
-    if (getrlimit (RLIMIT_STACK, &rlim) == 0)
2a3871a
-      {
2a3871a
-        rlim.rlim_cur = rlim.rlim_max;
2a3871a
-        setrlimit (RLIMIT_STACK, &rlim);
2a3871a
-      }
2a3871a
-  }
2a3871a
+  set_max_stack_rlimit ();
2a3871a
 #endif
2a3871a
 
2a3871a
 #ifdef HAVE_ATEXIT
2a3871a
diff -Burp make-3.81/make.h make-3.81-pm/make.h
2a3871a
--- make-3.81/make.h	2006-11-30 11:00:23.000000000 +0100
2a3871a
+++ make-3.81-pm/make.h	2006-11-30 10:29:50.000000000 +0100
2a3871a
@@ -346,6 +346,13 @@ extern int strcmpi (const char *,const c
2a3871a
 #define N_(msgid)           gettext_noop (msgid)
2a3871a
 #define S_(msg1,msg2,num)   ngettext (msg1,msg2,num)
2a3871a
 
2a3871a
+/* Handle rlimit */
2a3871a
+#if defined(HAVE_SYS_RESOURCE_H) && defined(HAVE_GETRLIMIT) && defined(HAVE_SETRLIMIT)
2a3871a
+# define SET_STACK_SIZE
2a3871a
+void set_max_stack_rlimit (void);
2a3871a
+void restore_original_stack_rlimit (void);
2a3871a
+#endif
2a3871a
+
2a3871a
 /* Handle other OSs.  */
2a3871a
 #if defined(HAVE_DOS_PATHS)
2a3871a
 # define PATH_SEPARATOR_CHAR ';'