makeparallel: reset make's unlimited stack

make 3.81 sets its own stack size to be unlimited, but accidentally
leaves it unlimited for all child processes.  If it is unlimited, reset
it back to a reasonable default (8MB).

See http://savannah.gnu.org/bugs/?22010

Change-Id: Ieb0289823f12a421b59d8ab5292d3df3c6dfc27e
This commit is contained in:
Colin Cross 2016-04-06 17:59:14 -07:00
parent a6a6285686
commit 8f9a53258b
1 changed files with 10 additions and 0 deletions

View File

@ -26,6 +26,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <sys/resource.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
@ -343,6 +344,15 @@ int main(int argc, char* argv[]) {
// child // child
unsetenv("MAKEFLAGS"); unsetenv("MAKEFLAGS");
unsetenv("MAKELEVEL"); unsetenv("MAKELEVEL");
// make 3.81 sets the stack ulimit to unlimited, which may cause problems
// for child processes
struct rlimit rlim{};
if (getrlimit(RLIMIT_STACK, &rlim) == 0 && rlim.rlim_cur == RLIM_INFINITY) {
rlim.rlim_cur = 8*1024*1024;
setrlimit(RLIMIT_STACK, &rlim);
}
int ret = execvp(path, args.data()); int ret = execvp(path, args.data());
if (ret < 0) { if (ret < 0) {
error(errno, errno, "exec %s failed", path); error(errno, errno, "exec %s failed", path);