summaryrefslogtreecommitdiff
path: root/src/emacs.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2018-10-04 19:13:17 +0300
committerEli Zaretskii <eliz@gnu.org>2018-10-04 19:13:17 +0300
commit86d2169ac3458412a084c7fc4047c3a389924cad (patch)
tree3a93837bd2311f1272a4da06ac958e7e88f7be6e /src/emacs.c
parentac3622c81acb93fa340a1e0e73188b1587b3970a (diff)
downloademacs-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)
Diffstat (limited to 'src/emacs.c')
-rw-r--r--src/emacs.c10
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 */