Skip to content

Commit 3c00dd3

Browse files
committed
Fix map_shadow_stack syscall number
* Syscall number for map_shadow_stack has changed since initial support was added. * Use SYS_map_shadow_stack instead of hard-coded number when possible
1 parent bac1b17 commit 3c00dd3

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

Zend/zend_fibers.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,14 @@
6767
#endif
6868

6969
# if defined __CET__
70+
# include <sys/syscall.h>
71+
# include <unistd.h>
7072
# include <cet.h>
7173
# define SHSTK_ENABLED (__CET__ & 0x2)
7274
# define BOOST_CONTEXT_SHADOW_STACK (SHSTK_ENABLED && SHADOW_STACK_SYSCALL)
73-
# define __NR_map_shadow_stack 451
75+
# ifndef SYS_map_shadow_stack
76+
# define SYS_map_shadow_stack 453
77+
# endif
7478
# ifndef SHADOW_STACK_SET_TOKEN
7579
# define SHADOW_STACK_SET_TOKEN 0x1
7680
#endif
@@ -276,7 +280,7 @@ static zend_fiber_stack *zend_fiber_stack_allocate(size_t size)
276280

277281
/* issue syscall to create shadow stack for the new fcontext */
278282
/* SHADOW_STACK_SET_TOKEN option will put "restore token" on the new shadow stack */
279-
stack->ss_base = (void *)syscall(__NR_map_shadow_stack, 0, stack->ss_size, SHADOW_STACK_SET_TOKEN);
283+
stack->ss_base = (void *)syscall(SYS_map_shadow_stack, 0, stack->ss_size, SHADOW_STACK_SET_TOKEN);
280284

281285
if (stack->ss_base == MAP_FAILED) {
282286
zend_throw_exception_ex(NULL, 0, "Fiber shadow stack allocate failed: mmap failed: %s (%d)", strerror(errno), errno);

configure.ac

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1316,11 +1316,18 @@ fi
13161316
dnl Check whether syscall to create shadow stack exists, should be a better way, but...
13171317
AC_CACHE_CHECK([whether syscall to create shadow stack exists], ac_cv_syscall_shadow_stack_exists,
13181318
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
1319+
#include <sys/syscall.h>
13191320
#include <unistd.h>
13201321
#include <sys/mman.h>
1322+
#ifndef SYS_map_shadow_stack
1323+
# define SYS_map_shadow_stack 453
1324+
#endif
1325+
#ifndef SHADOW_STACK_SET_TOKEN
1326+
# define SHADOW_STACK_SET_TOKEN 0x1
1327+
#endif
13211328
int main(void) {
1322-
/* test if syscall 451, i.e., map_shadow_stack is available */
1323-
void* base = (void *)syscall(451, 0, 0x20000, 0x1);
1329+
/* test if map_shadow_stack is available */
1330+
void* base = (void *)syscall(SYS_map_shadow_stack, 0, 0x20000, SHADOW_STACK_SET_TOKEN);
13241331
if (base != (void*)-1) {
13251332
munmap(base, 0x20000);
13261333
return 0;

0 commit comments

Comments
 (0)