Skip to content

Commit

Permalink
Add a testcase.
Browse files Browse the repository at this point in the history
When running under seccomp, sometimes sysexit handlers fail to execute.
This is possible when the first syscall a process makes,
before seccomp is enabled, gets handled in the SIGTRAP path.
However the conditions for this to occur seem fairly random,
so we fork out many processes to make it likely that at least
some hit this problem.

This problem may be related to issue #106.
  • Loading branch information
jzakrzew authored and oxr463 committed Sep 7, 2021
1 parent 6265aee commit 83b213a
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
3 changes: 3 additions & 0 deletions test/GNUmakefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ check-%.c: $(ROOTFS)/bin/% setup
$(call check_c,$*,$(PROOT) -b /proc -r $(ROOTFS) /bin/$*)

# Special cases.
check-test-sysexit.c: test-sysexit
$(call check_c,$<,env PROOT_FORCE_KOMPAT=1 $(PROOT) -k 3.4242XX ./$<)

check-test-bdc90417.c: test-bdc90417
$(call check_c,$<,$(PROOT) -w . ./$<)

Expand Down
35 changes: 35 additions & 0 deletions test/test-sysexit.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/* -*- c-set-style: "K&R"; c-basic-offset: 8 -*- */
#include <stdlib.h>
#include <sys/utsname.h>
#include <sys/wait.h> /* wait(2), */
#include <unistd.h>
#include <string.h>

/* Related to github issue #106.
* Test if sysexit handlers execute, using uname handling
* in the kompat extension. The test case is meant to be
* run with "-k 3.4242XX" cmdline argument.
* The bug could occur during the first traced syscall,
* before seccomp got enabled.
* However there was some kind of a random factor there,
* so we fork out many processes to make it likely that at least
* some would hit this problem. */

int main()
{
int status;
struct utsname s;
for (int i = 0; i < 5; i++) {
fork();
}
uname(&s);
int child_status;
while ((status = wait(&child_status)) >= 0) {
if (!WIFEXITED(child_status) || (WEXITSTATUS(child_status) == EXIT_FAILURE))
exit(EXIT_FAILURE);
}
if (strcmp("3.4242XX", s.release) == 0) {
exit(EXIT_SUCCESS);
}
exit(EXIT_FAILURE);
}

0 comments on commit 83b213a

Please sign in to comment.