Skip to content

Commit d7a2119

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 2f64de7 commit d7a2119

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
@@ -270,7 +274,7 @@ static zend_fiber_stack *zend_fiber_stack_allocate(size_t size)
270274

271275
/* issue syscall to create shadow stack for the new fcontext */
272276
/* SHADOW_STACK_SET_TOKEN option will put "restore token" on the new shadow stack */
273-
stack->ss_base = (void *)syscall(__NR_map_shadow_stack, 0, stack->ss_size, SHADOW_STACK_SET_TOKEN);
277+
stack->ss_base = (void *)syscall(SYS_map_shadow_stack, 0, stack->ss_size, SHADOW_STACK_SET_TOKEN);
274278

275279
if (stack->ss_base == MAP_FAILED) {
276280
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
@@ -1320,11 +1320,18 @@ fi
13201320
dnl Check whether syscall to create shadow stack exists, should be a better way, but...
13211321
AC_CACHE_CHECK([whether syscall to create shadow stack exists], ac_cv_syscall_shadow_stack_exists,
13221322
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
1323+
#include <sys/syscall.h>
13231324
#include <unistd.h>
13241325
#include <sys/mman.h>
1326+
#ifndef SYS_map_shadow_stack
1327+
# define SYS_map_shadow_stack 453
1328+
#endif
1329+
#ifndef SHADOW_STACK_SET_TOKEN
1330+
# define SHADOW_STACK_SET_TOKEN 0x1
1331+
#endif
13251332
int main(void) {
1326-
/* test if syscall 451, i.e., map_shadow_stack is available */
1327-
void* base = (void *)syscall(451, 0, 0x20000, 0x1);
1333+
/* test if map_shadow_stack is available */
1334+
void* base = (void *)syscall(SYS_map_shadow_stack, 0, 0x20000, SHADOW_STACK_SET_TOKEN);
13281335
if (base != (void*)-1) {
13291336
munmap(base, 0x20000);
13301337
return 0;

0 commit comments

Comments
 (0)