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:
H.J. Lu 2022-01-16 12:09:57 -08:00
parent 980450f126
commit 1a23b39f9d

View file

@ -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>