Fix alternate stack for Alpine docker on SELinux (#17936)
authorJan Vorlicek <janvorli@microsoft.com>
Thu, 10 May 2018 13:33:54 +0000 (15:33 +0200)
committerGitHub <noreply@github.com>
Thu, 10 May 2018 13:33:54 +0000 (15:33 +0200)
commitb50ce91e9bd75170ef6aaeb65b9b80824539919c
treec9fd4aed8a23b1c22ffa3d9e76a3cf4ced048a1d
parent1ecd2be3cebc4b791d559d162228aa1ddf388564
Fix alternate stack for Alpine docker on SELinux (#17936)

For some reason, the Alpine docker container running on a SELinux host maps
heap as RWX. When we allocate alternate stack from the heap, we also
change the protection of the first page to PROT_NONE so that it can
serve as a guard page to catch stack overflow. And when we free the
alternate stack, we restore the protection back to PROT_READ |
PROT_WRITE. The restoration fails in Alpine docker container running on
a SELinux host with EPROT failure and the SELinux log reports that an
attempt to change heap to executable was made. So it looks like the
kernel has added the PERM_EXEC to the permissions we have passed to the
mprotect call. There is a code in the mprotect implementation that can
do that, although I don't fully understand the conditions under which it
happens. This is driven by the VM_MAYEXEC flag in the internal VMA block
structure.
To fix that, I've modified the alternate stack allocation to use mmap /
munmap instead of C heap allocation.
src/pal/src/exception/signal.cpp