Skip to content

Commit 5a94da0

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 fc8f530 commit 5a94da0

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
@@ -69,10 +69,14 @@
6969
#endif
7070

7171
# if defined __CET__
72+
# include <sys/syscall.h>
73+
# include <unistd.h>
7274
# include <cet.h>
7375
# define SHSTK_ENABLED (__CET__ & 0x2)
7476
# define BOOST_CONTEXT_SHADOW_STACK (SHSTK_ENABLED && SHADOW_STACK_SYSCALL)
75-
# define __NR_map_shadow_stack 451
77+
# ifndef SYS_map_shadow_stack
78+
# define SYS_map_shadow_stack 453
79+
# endif
7680
# ifndef SHADOW_STACK_SET_TOKEN
7781
# define SHADOW_STACK_SET_TOKEN 0x1
7882
#endif
@@ -272,7 +276,7 @@ static zend_fiber_stack *zend_fiber_stack_allocate(size_t size)
272276

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

277281
if (stack->ss_base == MAP_FAILED) {
278282
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
@@ -1331,11 +1331,18 @@ fi
13311331
dnl Check whether syscall to create shadow stack exists, should be a better way, but...
13321332
AC_CACHE_CHECK([whether syscall to create shadow stack exists], ac_cv_syscall_shadow_stack_exists,
13331333
[AC_RUN_IFELSE([AC_LANG_SOURCE([[
1334+
#include <sys/syscall.h>
13341335
#include <unistd.h>
13351336
#include <sys/mman.h>
1337+
#ifndef SYS_map_shadow_stack
1338+
# define SYS_map_shadow_stack 453
1339+
#endif
1340+
#ifndef SHADOW_STACK_SET_TOKEN
1341+
# define SHADOW_STACK_SET_TOKEN 0x1
1342+
#endif
13361343
int main(void) {
1337-
/* test if syscall 451, i.e., map_shadow_stack is available */
1338-
void* base = (void *)syscall(451, 0, 0x20000, 0x1);
1344+
/* test if map_shadow_stack is available */
1345+
void* base = (void *)syscall(SYS_map_shadow_stack, 0, 0x20000, SHADOW_STACK_SET_TOKEN);
13391346
if (base != (void*)-1) {
13401347
munmap(base, 0x20000);
13411348
return 0;

0 commit comments

Comments
 (0)