diff options
author | Eli Zaretskii <eliz@gnu.org> | 2018-10-04 19:13:17 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2018-10-04 19:13:17 +0300 |
commit | 86d2169ac3458412a084c7fc4047c3a389924cad (patch) | |
tree | 3a93837bd2311f1272a4da06ac958e7e88f7be6e | |
parent | ac3622c81acb93fa340a1e0e73188b1587b3970a (diff) | |
download | emacs-86d2169ac3458412a084c7fc4047c3a389924cad.tar.gz |
Avoid ridiculously high stack limit requests on macOS
* src/emacs.c (main): Avoid wraparound in subtraction of
rlim_t values, in case rlim_t is an unsigned type. (Bug#32338)
-rw-r--r-- | src/emacs.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/emacs.c b/src/emacs.c index 483e848f6db..f80047e89e7 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -875,7 +875,8 @@ main (int argc, char **argv) newlim = rlim.rlim_max; newlim -= newlim % pagesize; - if (pagesize <= newlim - lim) + if (newlim > lim /* in case rlim_t is an unsigned type */ + && pagesize <= newlim - lim) { rlim.rlim_cur = newlim; if (setrlimit (RLIMIT_STACK, &rlim) == 0) @@ -884,9 +885,10 @@ main (int argc, char **argv) } /* If the stack is big enough, let regex.c more of it before falling back to heap allocation. */ - emacs_re_safe_alloca = max - (min (lim - extra, SIZE_MAX) * (min_ratio / ratio), - MAX_ALLOCA); + if (lim < extra) + lim = extra; /* avoid wrap-around in unsigned subtraction */ + emacs_re_safe_alloca = + max (min (lim - extra, SIZE_MAX) * (min_ratio / ratio), MAX_ALLOCA); } #endif /* HAVE_SETRLIMIT and RLIMIT_STACK and not CYGWIN */ |