You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							127 lines
						
					
					
						
							3.9 KiB
						
					
					
				
			
		
		
	
	
							127 lines
						
					
					
						
							3.9 KiB
						
					
					
				# --- SDE-COPYRIGHT-NOTE-BEGIN --- | 
						|
# This copyright note is auto-generated by ./scripts/Create-CopyPatch. | 
						|
# | 
						|
# Filename: package/.../make/0002-fix-stack-limit.patch | 
						|
# Copyright (C) 2010 The OpenSDE Project | 
						|
# | 
						|
# More information can be found in the files COPYING and README. | 
						|
# | 
						|
# This patch file is dual-licensed. It is available under the license the | 
						|
# patched project is licensed under, as long as it is an OpenSource license | 
						|
# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms | 
						|
# of the GNU General Public License as published by the Free Software | 
						|
# Foundation; either version 2 of the License, or (at your option) any later | 
						|
# version. | 
						|
# --- SDE-COPYRIGHT-NOTE-END --- | 
						|
 | 
						|
bug #22010: The increased stack rlimit is inherited by the subprocesses to make. | 
						|
http://savannah.gnu.org/bugs/?22010 | 
						|
http://cvs.savannah.gnu.org/viewvc/make/make.h?root=make&r1=1.132&r2=1.133&view=patch | 
						|
http://cvs.savannah.gnu.org/viewvc/make/main.c?root=make&r1=1.228&r2=1.229&view=patch | 
						|
http://cvs.savannah.gnu.org/viewvc/make/job.c?root=make&r1=1.191&r2=1.192&view=patch | 
						|
 | 
						|
2009-06-07  Paul Smith  <[email protected]> | 
						|
	* make.h: Move SET_STACK_SIZE determination to make.h. | 
						|
	* main.c (main): New global variable, STACK_LIMIT, holds the | 
						|
	original stack limit when make was started. | 
						|
	* job.c (start_job_command): Reset the stack limit, if we changed it. | 
						|
	Fixes Savannah bug #22010. | 
						|
 | 
						|
diff --git a/job.c b/job.c | 
						|
index 3251efe..7fe08fa 100644 | 
						|
--- a/job.c | 
						|
+++ b/job.c | 
						|
@@ -1275,6 +1275,12 @@ start_job_command (struct child *child) | 
						|
           if (job_rfd >= 0) | 
						|
             close (job_rfd); | 
						|
  | 
						|
+#ifdef SET_STACK_SIZE | 
						|
+          /* Reset limits, if necessary.  */ | 
						|
+          if (stack_limit.rlim_cur) | 
						|
+            setrlimit (RLIMIT_STACK, &stack_limit); | 
						|
+#endif | 
						|
+ | 
						|
 	  child_execute_job (child->good_stdin ? 0 : bad_stdin, 1, | 
						|
                              argv, child->environment); | 
						|
 	} | 
						|
@@ -2237,7 +2243,7 @@ construct_command_argv_internal (char *line, char **restp, char *shell, | 
						|
 				 "for", "case", "if", ":", ".", "break", | 
						|
 				 "continue", "export", "read", "readonly", | 
						|
 				 "shift", "times", "trap", "switch", "unset", | 
						|
-                                 0 }; | 
						|
+                                 "ulimit", 0 }; | 
						|
  | 
						|
   char *sh_chars; | 
						|
   char **sh_cmds; | 
						|
diff --git a/main.c b/main.c | 
						|
index 483babf..42964e0 100644 | 
						|
--- a/main.c | 
						|
+++ b/main.c | 
						|
@@ -44,14 +44,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.  */ | 
						|
 # 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> | 
						|
-#endif | 
						|
- | 
						|
 #ifdef _AMIGA | 
						|
 int __stack = 20000; /* Make sure we have 20K of stack space */ | 
						|
 #endif | 
						|
@@ -213,6 +205,13 @@ int print_version_flag = 0; | 
						|
  | 
						|
 static struct stringlist *makefiles = 0; | 
						|
  | 
						|
+/* Size of the stack when we started.  */ | 
						|
+ | 
						|
+#ifdef SET_STACK_SIZE | 
						|
+struct rlimit stack_limit; | 
						|
+#endif | 
						|
+ | 
						|
+ | 
						|
 /* Number of job slots (commands that can be run at once).  */ | 
						|
  | 
						|
 unsigned int job_slots = 1; | 
						|
@@ -919,11 +918,15 @@ main (int argc, char **argv, char **envp) | 
						|
     struct rlimit rlim; | 
						|
  | 
						|
     /* Set the stack limit huge so that alloca does not fail.  */ | 
						|
-    if (getrlimit (RLIMIT_STACK, &rlim) == 0) | 
						|
+    if (getrlimit (RLIMIT_STACK, &rlim) == 0 | 
						|
+        && rlim.rlim_cur > 0 && rlim.rlim_cur < rlim.rlim_max) | 
						|
       { | 
						|
+        stack_limit = rlim; | 
						|
         rlim.rlim_cur = rlim.rlim_max; | 
						|
         setrlimit (RLIMIT_STACK, &rlim); | 
						|
       } | 
						|
+    else | 
						|
+      stack_limit.rlim_cur = 0; | 
						|
   } | 
						|
 #endif | 
						|
  | 
						|
diff --git a/make.h b/make.h | 
						|
index 994f4f2..25c2bef 100644 | 
						|
--- a/make.h | 
						|
+++ b/make.h | 
						|
@@ -378,6 +378,14 @@ extern int no_default_sh_exe; | 
						|
 extern int unixy_shell; | 
						|
 #endif  /* WINDOWS32 */ | 
						|
  | 
						|
+#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> | 
						|
+struct rlimit stack_limit; | 
						|
+#endif | 
						|
+ | 
						|
 struct floc | 
						|
   { | 
						|
     const char *filenm; | 
						|
--  | 
						|
1.6.5.3 | 
						|
 | 
						|
 |