aboutsummaryrefslogtreecommitdiffstats
path: root/src/sysdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sysdep.c')
-rw-r--r--src/sysdep.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/sysdep.c b/src/sysdep.c
index 56142a55cdf..16541735f03 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -129,6 +129,48 @@ static const int baud_convert[] =
129 1800, 2400, 4800, 9600, 19200, 38400 129 1800, 2400, 4800, 9600, 19200, 38400
130 }; 130 };
131 131
132#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
133# include <sys/personality.h>
134
135/* Disable address randomization in the current process. Return true
136 if addresses were randomized but this has been disabled, false
137 otherwise. */
138bool
139disable_address_randomization (void)
140{
141 bool disabled = false;
142 int pers = personality (0xffffffff);
143 disabled = (! (pers & ADDR_NO_RANDOMIZE)
144 && 0 <= personality (pers | ADDR_NO_RANDOMIZE));
145 return disabled;
146}
147#endif
148
149/* Execute the program in FILE, with argument vector ARGV and environ
150 ENVP. Return an error number if unsuccessful. This is like execve
151 except it reenables ASLR in the executed program if necessary, and
152 on error it returns an error number rather than -1. */
153int
154emacs_exec_file (char const *file, char *const *argv, char *const *envp)
155{
156#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
157 int pers = getenv ("EMACS_HEAP_EXEC") ? personality (0xffffffff) : -1;
158 bool change_personality = 0 <= pers && pers & ADDR_NO_RANDOMIZE;
159 if (change_personality)
160 personality (pers & ~ADDR_NO_RANDOMIZE);
161#endif
162
163 execve (file, argv, envp);
164 int err = errno;
165
166#ifdef HAVE_PERSONALITY_ADDR_NO_RANDOMIZE
167 if (change_personality)
168 personality (pers);
169#endif
170
171 return err;
172}
173
132/* If FD is not already open, arrange for it to be open with FLAGS. */ 174/* If FD is not already open, arrange for it to be open with FLAGS. */
133static void 175static void
134force_open (int fd, int flags) 176force_open (int fd, int flags)