aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator
diff options
context:
space:
mode:
authorSverker Eriksson <[email protected]>2016-09-16 19:39:24 +0200
committerSverker Eriksson <[email protected]>2016-10-14 14:29:15 +0200
commita82be01198c1f3714f29f0a0e3ce3ed6d6bce0a6 (patch)
treeb5d95ca5c9298e51867a9008d600b5270471fe8a /erts/emulator
parent5e879fb1d4a9273f0a6183da7509dcdbc24f9653 (diff)
downloadotp-a82be01198c1f3714f29f0a0e3ce3ed6d6bce0a6.tar.gz
otp-a82be01198c1f3714f29f0a0e3ce3ed6d6bce0a6.tar.bz2
otp-a82be01198c1f3714f29f0a0e3ce3ed6d6bce0a6.zip
erts: Fill freed EXEC memory with illegal instructions on DEBUG
to get a nice SIGILL crash. For x86 and x86_64 only.
Diffstat (limited to 'erts/emulator')
-rw-r--r--erts/emulator/beam/erl_alloc.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c
index 3c2c9def3b..d96b90fd55 100644
--- a/erts/emulator/beam/erl_alloc.c
+++ b/erts/emulator/beam/erl_alloc.c
@@ -4129,12 +4129,20 @@ debug_free(ErtsAlcType_t n, void *extra, void *ptr)
ErtsAllocatorFunctions_t *real_af = (ErtsAllocatorFunctions_t *) extra;
void *dptr;
Uint size;
+ int free_pattern = n;
ASSERT(ERTS_ALC_N_MIN <= n && n <= ERTS_ALC_N_MAX);
dptr = check_memory_fence(ptr, &size, n, ERTS_ALC_O_FREE);
- sys_memset((void *) dptr, n, size + FENCE_SZ);
+#ifdef ERTS_ALC_A_EXEC
+# if defined(__i386__) || defined(__x86_64__)
+ if (ERTS_ALC_T2A(ERTS_ALC_N2T(n)) == ERTS_ALC_A_EXEC) {
+ free_pattern = 0x0f; /* Illegal instruction */
+ }
+# endif
+#endif
+ sys_memset((void *) dptr, free_pattern, size + FENCE_SZ);
(*real_af->free)(n, real_af->extra, dptr);