mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
x86/cet: Update tst-cet-vfork-1
Change tst-cet-vfork-1.c to verify that vfork child return triggers SIGSEGV due to shadow stack mismatch.
This commit is contained in:
parent
980450f126
commit
1a23b39f9d
1 changed files with 17 additions and 26 deletions
|
@ -18,34 +18,26 @@
|
||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/wait.h>
|
#include <sys/wait.h>
|
||||||
#include <x86intrin.h>
|
#include <x86intrin.h>
|
||||||
#include <support/test-driver.h>
|
#include <support/test-driver.h>
|
||||||
#include <support/xsignal.h>
|
|
||||||
#include <support/xunistd.h>
|
|
||||||
|
|
||||||
__attribute__ ((noclone, noinline))
|
__attribute__ ((noclone, noinline))
|
||||||
static void
|
static void
|
||||||
do_test_1 (void)
|
do_test_1 (void)
|
||||||
{
|
{
|
||||||
pid_t p1;
|
pid_t p1;
|
||||||
int fd[2];
|
|
||||||
|
|
||||||
if (pipe (fd) == -1)
|
/* NB: Since child return pops shadow stack which is shared with
|
||||||
{
|
parent, child must not return after vfork. */
|
||||||
puts ("pipe failed");
|
|
||||||
_exit (EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((p1 = vfork ()) == 0)
|
if ((p1 = vfork ()) == 0)
|
||||||
{
|
{
|
||||||
pid_t p = getpid ();
|
/* Child return should trigger SIGSEGV due to shadow stack
|
||||||
TEMP_FAILURE_RETRY (write (fd[1], &p, sizeof (p)));
|
mismatch. */
|
||||||
/* Child return should trigger SIGSEGV. */
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else if (p1 == -1)
|
else if (p1 == -1)
|
||||||
|
@ -54,22 +46,22 @@ do_test_1 (void)
|
||||||
_exit (EXIT_FAILURE);
|
_exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
pid_t p2 = 0;
|
|
||||||
if (TEMP_FAILURE_RETRY (read (fd[0], &p2, sizeof (pid_t)))
|
|
||||||
!= sizeof (pid_t))
|
|
||||||
puts ("pipd read failed");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int r;
|
int r;
|
||||||
if (TEMP_FAILURE_RETRY (waitpid (p1, &r, 0)) != p1)
|
if (TEMP_FAILURE_RETRY (waitpid (p1, &r, 0)) != p1)
|
||||||
|
{
|
||||||
puts ("waitpid failed");
|
puts ("waitpid failed");
|
||||||
else if (r != 0)
|
_exit (EXIT_FAILURE);
|
||||||
puts ("pip write in child failed");
|
}
|
||||||
|
|
||||||
|
if (!WIFSIGNALED (r) || WTERMSIG (r) != SIGSEGV)
|
||||||
|
{
|
||||||
|
puts ("Child not terminated with SIGSEGV");
|
||||||
|
_exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parent exits immediately so that parent returns without triggering
|
/* Parent exits immediately so that parent returns without triggering
|
||||||
SIGSEGV when shadow stack isn't in use. */
|
SIGSEGV when shadow stack is in use. */
|
||||||
_exit (EXIT_FAILURE);
|
_exit (EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -80,9 +72,8 @@ do_test (void)
|
||||||
return EXIT_UNSUPPORTED;
|
return EXIT_UNSUPPORTED;
|
||||||
do_test_1 ();
|
do_test_1 ();
|
||||||
/* Child exits immediately so that child returns without triggering
|
/* Child exits immediately so that child returns without triggering
|
||||||
SIGSEGV when shadow stack isn't in use. */
|
SIGSEGV when shadow stack is in use. */
|
||||||
_exit (EXIT_FAILURE);
|
_exit (EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EXPECTED_SIGNAL (_get_ssp () == 0 ? 0 : SIGSEGV)
|
|
||||||
#include <support/test-driver.c>
|
#include <support/test-driver.c>
|
||||||
|
|
Loading…
Add table
Reference in a new issue