看板 DFBSD_submit 關於我們 聯絡資訊
This is a multi-part message in MIME format. --------------050805020500090801080700 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit PatchSet 376 Date: 2004/11/24 22:03:45 Author: jmallett Log: Gentle code cleanup for the maximum make(1) level foo. This moves it to a function, and moves the related defines out of the middle of code body. Submitted by: Max Okumoto less-than okumoto at ucsd dot edu greater-than Members: main.c:1.98->1.99 --------------050805020500090801080700 Content-Type: text/plain; name="patch-4.376" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="patch-4.376" --------------------- PatchSet 376 Date: 2004/11/24 22:03:45 Author: jmallett Log: Gentle code cleanup for the maximum make(1) level foo. This moves it to a function, and moves the related defines out of the middle of code body. Submitted by: Max Okumoto less-than okumoto at ucsd dot edu greater-than Members: main.c:1.98->1.99 Index: main.c =================================================================== RCS file: /usr/home/okumoto/Work/make/fbsd-cvs/src/usr.bin/make/main.c,v retrieving revision 1.98 retrieving revision 1.99 diff -u -r1.98 -r1.99 --- main.c 17 Nov 2004 11:32:46 -0000 1.98 +++ main.c 24 Nov 2004 22:03:45 -0000 1.99 @@ -90,6 +90,8 @@ #include "pathnames.h" #define WANT_ENV_MKLVL 1 +#define MKLVL_MAXVAL 500 +#define MKLVL_ENVVAR "__MKLVL__" #define MAKEFLAGS ".MAKEFLAGS" @@ -404,4 +406,28 @@ +/* + * In lieu of a good way to prevent every possible looping in + * make(1), stop there from being more than MKLVL_MAXVAL processes forked + * by make(1), to prevent a forkbomb from happening, in a dumb and + * mechanical way. + */ +static void +check_make_level(void) +{ +#ifdef WANT_ENV_MKLVL + char *value = getenv(MKLVL_ENVVAR); + int level = (value == NULL) ? 0 : atoi(value); + + if (level < 0) { + errc(2, EAGAIN, "Invalid value for recursion level (%d).", level); + } else if (level > MKLVL_MAXVAL) { + errc(2, EAGAIN, "Max recursion level (%d) exceeded.", MKLVL_MAXVAL); + } else { + char new_value[32]; + sprintf(new_value, "%d", level + 1); + setenv(MKLVL_ENVVAR, new_value, 1); + } +#endif /* WANT_ENV_MKLVL */ +} /*- * main -- * The main function, for obvious reasons. Initializes variables @@ -428,12 +455,6 @@ Boolean outOfDate = TRUE; /* FALSE if all targets up to date */ struct stat sa; char *p, *p1, *path, *pathp; -#ifdef WANT_ENV_MKLVL -#define MKLVL_MAXVAL 500 -#define MKLVL_ENVVAR "__MKLVL__" - int iMkLvl = 0; - char *szMkLvl = getenv(MKLVL_ENVVAR); -#endif /* WANT_ENV_MKLVL */ char mdpath[MAXPATHLEN]; char obpath[MAXPATHLEN]; char cdpath[MAXPATHLEN]; @@ -461,13 +482,0 @@ -#ifdef WANT_ENV_MKLVL - if ((iMkLvl = szMkLvl ? atoi(szMkLvl) : 0) < 0) { - iMkLvl = 0; - } - if (iMkLvl++ > MKLVL_MAXVAL) { - errc(2, EAGAIN, - "Max recursion level (%d) exceeded.", MKLVL_MAXVAL); - } - bzero(szMkLvl = emalloc(32), 32); - sprintf(szMkLvl, "%d", iMkLvl); - setenv(MKLVL_ENVVAR, szMkLvl, 1); -#endif /* WANT_ENV_MKLVL */ - @@ -461,3 +482,6 @@ sigaction(SIGCHLD, &sa, NULL); } + check_make_level(); + + --------------050805020500090801080700--