diff --git a/test/issues/840/C840.sh b/test/issues/840/C840.sh new file mode 100644 index 00000000..39b174cc --- /dev/null +++ b/test/issues/840/C840.sh @@ -0,0 +1,152 @@ +#!/bin/sh +if ! sudo ls /sys/kernel/debug | grep kmemleak > /dev/null 2>&1; then + echo kmemleak: not found >&2 + exit 1 +fi + +echo 'C840T01... ' +ng=0 +sync +sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 +./ihkosctl 0 clear_kmsg +sudo dmesg -c > /dev/null +sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' +./mcexec ./C840T01 +if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then + echo 'C840T01: NG (kmemleak)' + ng=1 +fi +if ! dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then + echo 'C840T01: WARN (remote_page_fault)' + ng=1 +fi +if ! ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then + echo 'C840T01: WARN (syscall offloading)' + ng=1 +fi +if [ $ng = 0 ]; then + echo C840T01: OK +fi + +echo 'C840T02... ' +ng=0 +sync +sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 +./ihkosctl 0 clear_kmsg +sudo dmesg -c > /dev/null +sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' +./mcexec ./C840T02 +if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then + echo 'C840T02: NG (kmemleak)' + ng=1 +fi +if dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then + echo 'C840T02: WARN (remote_page_fault)' + ng=1 +fi +if ! ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then + echo 'C840T02: WARN (syscall offloading)' + ng=1 +fi +if [ $ng = 0 ]; then + echo C840T02: OK +fi + +echo 'C840T03... ' +ng=0 +sync +sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 +./ihkosctl 0 clear_kmsg +sudo dmesg -c > /dev/null +sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' +./mcexec ./C840T03 +if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then + echo 'C840T03: NG (kmemleak)' + ng=1 +fi +if dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then + echo 'C840T03: WARN (remote_page_fault)' + ng=1 +fi +if ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then + echo 'C840T03: WARN (syscall offloading)' + ng=1 +fi +if [ $ng = 0 ]; then + echo C840T03: OK +fi + +echo 'C840T04... ' +ng=0 +sync +sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 +./ihkosctl 0 clear_kmsg +sudo dmesg -c > /dev/null +sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' +timeout -s 9 2 ./mcexec ./C840T04 +sleep 2 +if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then + echo 'C840T04: NG (kmemleak)' + ng=1 +fi +if ! dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then + echo 'C840T04: WARN (remote_page_fault)' + ng=1 +fi +if ! ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then + echo 'C840T04: WARN (syscall offloading)' + ng=1 +fi +if [ $ng = 0 ]; then + echo C840T04: OK +fi + +echo 'C840T05... ' +ng=0 +sync +sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 +./ihkosctl 0 clear_kmsg +sudo dmesg -c > /dev/null +sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' +timeout -s 9 2 ./mcexec ./C840T05 +sleep 2 +if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then + echo 'C840T05: NG (kmemleak)' + ng=1 +fi +if dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then + echo 'C840T05: WARN (remote_page_fault)' + ng=1 +fi +if ! ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then + echo 'C840T05: WARN (syscall offloading)' + ng=1 +fi +if [ $ng = 0 ]; then + echo C840T05: OK +fi + +echo 'C840T06... ' +ng=0 +sync +sudo /sbin/sysctl vm.drop_caches=3 > /dev/null 2>&1 +./ihkosctl 0 clear_kmsg +sudo dmesg -c > /dev/null +sudo sh -c 'echo clear > /sys/kernel/debug/kmemleak' +timeout -s 9 2 ./mcexec ./C840T06 +sleep 2 +if [ `sudo cat /sys/kernel/debug/kmemleak | wc -l` != 0 ]; then + echo 'C840T06: NG (kmemleak)' + ng=1 +fi +if dmesg | grep 'remote_page_fault:interrupted. -512' > /dev/null 2>&1; then + echo 'C840T06: WARN (remote_page_fault)' + ng=1 +fi +if ./ihkosctl 0 kmsg | grep 'is dead, terminate()' > /dev/null 2>&1; then + echo 'C840T06: WARN (syscall offloading)' + ng=1 +fi +if [ $ng = 0 ]; then + echo C840T06: OK +fi diff --git a/test/issues/840/C840.txt b/test/issues/840/C840.txt new file mode 100644 index 00000000..7795e8f6 --- /dev/null +++ b/test/issues/840/C840.txt @@ -0,0 +1,28 @@ +スクリプトは Wed Jun 6 14:38:21 2018 + に開始しました[?1034hbash-4.2$ sh C840.sh +C840T01... +Terminate by signal 9 +C840.sh: 14 行: 22464 強制終了 ./mcexec ./C840T01 +C840T01: OK +C840T02... +Terminate by signal 9 +C840.sh: 38 行: 22500 強制終了 ./mcexec ./C840T02 +C840T02: OK +C840T03... +Terminate by signal 9 +C840.sh: 62 行: 22535 強制終了 ./mcexec ./C840T03 +C840T03: OK +C840T04... +C840.sh: 86 行: 22570 強制終了 timeout -s 9 2 ./mcexec ./C840T04 +C840T04: OK +C840T05... +C840.sh: 111 行: 22598 強制終了 timeout -s 9 2 ./mcexec ./C840T05 +C840T05: OK +C840T06... +C840.sh: 136 行: 22626 強制終了 timeout -s 9 2 ./mcexec ./C840T06 +C840T06: OK +bash-4.2$ exit +exit + +スクリプトは Wed Jun 6 14:38:51 2018 + に終了しました \ No newline at end of file diff --git a/test/issues/840/C840T01.c b/test/issues/840/C840T01.c new file mode 100644 index 00000000..9a08565b --- /dev/null +++ b/test/issues/840/C840T01.c @@ -0,0 +1,46 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + int fd; + void *p; + long l; + pid_t pid; + + pid = fork(); + if (pid == 0) { + sleep(1); + kill(getppid(), SIGKILL); + exit(0); + } + + fd = open("rpf.data", O_RDONLY); + if (fd == -1) { + perror("open(rpf.data)"); + exit(1); + } + p = mmap(NULL, 512*1024*1024, PROT_READ, MAP_PRIVATE, fd, 0); + if (p == (void *)-1) { + perror("mmap"); + exit(1); + } + close(fd); + fd = open("rpf.out", O_WRONLY|O_CREAT|O_TRUNC, 0600); + if (fd == -1) { + perror("open(fpt.out)"); + exit(1); + } + l = write(fd, p, 512*1024*1024); + printf("write=%ld\n", l); + close(fd); + munmap(p, 512*1024*1024); + exit(0); +} diff --git a/test/issues/840/C840T02.c b/test/issues/840/C840T02.c new file mode 100644 index 00000000..c62ea7aa --- /dev/null +++ b/test/issues/840/C840T02.c @@ -0,0 +1,27 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + pid_t pid; + int pfd[2]; + char c; + + pid = fork(); + if (pid == 0) { + sleep(1); + kill(getppid(), SIGKILL); + exit(0); + } + + pipe(pfd); + read(pfd[0], &c, 1); + exit(0); +} diff --git a/test/issues/840/C840T03.c b/test/issues/840/C840T03.c new file mode 100644 index 00000000..8878404e --- /dev/null +++ b/test/issues/840/C840T03.c @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + pid_t pid; + + pid = fork(); + if (pid == 0) { + sleep(1); + kill(getppid(), SIGKILL); + exit(0); + } + + for(;;); + exit(0); +} diff --git a/test/issues/840/C840T04.c b/test/issues/840/C840T04.c new file mode 100644 index 00000000..0a02992f --- /dev/null +++ b/test/issues/840/C840T04.c @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + int fd; + void *p; + long l; + + fd = open("rpf.data", O_RDONLY); + if (fd == -1) { + perror("open(rpf.data)"); + exit(1); + } + p = mmap(NULL, 512*1024*1024, PROT_READ, MAP_PRIVATE, fd, 0); + if (p == (void *)-1) { + perror("mmap"); + exit(1); + } + close(fd); + fd = open("rpf.out", O_WRONLY|O_CREAT|O_TRUNC, 0600); + if (fd == -1) { + perror("open(fpt.out)"); + exit(1); + } + l = write(fd, p, 512*1024*1024); + printf("write=%ld\n", l); + close(fd); + munmap(p, 512*1024*1024); + exit(0); +} diff --git a/test/issues/840/C840T05.c b/test/issues/840/C840T05.c new file mode 100644 index 00000000..039e5a7c --- /dev/null +++ b/test/issues/840/C840T05.c @@ -0,0 +1,19 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + int pfd[2]; + char c; + + pipe(pfd); + read(pfd[0], &c, 1); + exit(0); +} diff --git a/test/issues/840/C840T06.c b/test/issues/840/C840T06.c new file mode 100644 index 00000000..b4f2c835 --- /dev/null +++ b/test/issues/840/C840T06.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + for(;;); + exit(0); +} diff --git a/test/issues/926/C926.c b/test/issues/926/C926.c new file mode 100644 index 00000000..40b220bd --- /dev/null +++ b/test/issues/926/C926.c @@ -0,0 +1,587 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int +main(int argc, char **argv) +{ + pid_t pid1; + pid_t pid2; + pid_t pid3; + int st; + int p[2]; + int shmid; + int *sp; + key_t key; + int valid1; + int valid2; + int valid3; + char c; + int result; + struct shmid_ds buf; + + key = ftok(argv[0], 0); + + printf("C926T01... "); + fflush(stdout); + valid1 = 1; + valid2 = 2; + valid3 = 2; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, p) == -1) { + perror("socketpair"); + exit(1); + } + + if ((pid1 = fork()) == 0) { + close(p[0]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 0 + sp = shmat(shmid, NULL, 0); + *sp = 1; + // step 1 + st = *sp == valid1? 1: 0; + shmdt(sp); + write(p[1], &c, 1); + exit(st); + } + + if ((pid2 = fork()) == 0) { + close(p[1]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 2 + read(p[0], &c, 1); + sp = shmat(shmid, NULL, 0); + (*sp)++; + // step 3 + st = *sp == valid2? 1: 0; + shmdt(sp); + // step 4 + exit(st); + } + + close(p[0]); + close(p[1]); + result = 0; + waitpid(pid1, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + waitpid(pid2, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if ((pid3 = fork()) == 0) { + // step 5 + shmid = shmget(key, 4096, IPC_CREAT | 0660); + sp = shmat(shmid, NULL, 0); + st = *sp == valid3? 1: 0; + shmdt(sp); + exit(st); + } + + waitpid(pid3, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if (result == 3) { + printf("OK\n"); + } + else { + printf("NG\n"); + } + + printf("C926T02... "); + fflush(stdout); + valid1 = 1; + valid2 = 2; + valid3 = 2; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, p) == -1) { + perror("socketpair"); + exit(1); + } + + if ((pid1 = fork()) == 0) { + close(p[0]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 0 + sp = shmat(shmid, NULL, 0); + *sp = 1; + // step 1 + st = *sp == valid1? 1: 0; + exit(st); + } + + if ((pid2 = fork()) == 0) { + close(p[1]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 2 + read(p[0], &c, 1); + sp = shmat(shmid, NULL, 0); + (*sp)++; + // step 3 + st = *sp == valid2? 1: 0; + shmdt(sp); + // step 4 + exit(st); + } + + close(p[0]); + close(p[1]); + result = 0; + waitpid(pid1, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + waitpid(pid2, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if ((pid3 = fork()) == 0) { + // step 5 + shmid = shmget(key, 4096, IPC_CREAT | 0660); + sp = shmat(shmid, NULL, 0); + st = *sp == valid3? 1: 0; + shmdt(sp); + exit(st); + } + + waitpid(pid3, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if (result == 3) { + printf("OK\n"); + } + else { + printf("NG\n"); + } + + printf("C926T03... "); + fflush(stdout); + valid1 = 1; + valid2 = 1; + valid3 = 1; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, p) == -1) { + perror("socketpair"); + exit(1); + } + + if ((pid1 = fork()) == 0) { + close(p[0]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 0 + sp = shmat(shmid, NULL, 0); + *sp = 1; + // step 1 + shmctl(shmid, IPC_RMID, &buf); + write(p[1], &c, 1); + + // step3 + read(p[1], &c, 1); + st = *sp == valid1? 1: 0; + shmdt(sp); + write(p[1], &c, 1); + exit(st); + } + + if ((pid2 = fork()) == 0) { + close(p[1]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 2 + read(p[0], &c, 1); + sp = shmat(shmid, NULL, 0); + (*sp)++; + write(p[0], &c, 1); + // step 4 + read(p[0], &c, 1); + st = *sp == valid2? 1: 0; + shmdt(sp); + exit(st); + } + + close(p[0]); + close(p[1]); + result = 0; + waitpid(pid1, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + waitpid(pid2, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if ((pid3 = fork()) == 0) { + // step 5 + shmid = shmget(key, 4096, IPC_CREAT | 0660); + sp = shmat(shmid, NULL, 0); + st = *sp == valid3? 1: 0; + shmdt(sp); + exit(st); + } + + waitpid(pid3, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if (result == 3) { + printf("OK\n"); + } + else { + printf("NG\n"); + } + + printf("C926T04... "); + fflush(stdout); + valid1 = 1; + valid2 = 1; + valid3 = 1; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, p) == -1) { + perror("socketpair"); + exit(1); + } + + if ((pid1 = fork()) == 0) { + close(p[0]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 0 + sp = shmat(shmid, NULL, 0); + *sp = 1; + // step 1 + shmctl(shmid, IPC_RMID, &buf); + write(p[1], &c, 1); + + // step4 + read(p[1], &c, 1); + st = *sp == valid1? 1: 0; + shmdt(sp); + exit(st); + } + + if ((pid2 = fork()) == 0) { + close(p[1]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 2 + read(p[0], &c, 1); + sp = shmat(shmid, NULL, 0); + (*sp)++; + // step 3 + st = *sp == valid2? 1: 0; + shmdt(sp); + write(p[0], &c, 1); + exit(st); + } + + close(p[0]); + close(p[1]); + result = 0; + waitpid(pid1, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + waitpid(pid2, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if ((pid3 = fork()) == 0) { + // step 5 + shmid = shmget(key, 4096, IPC_CREAT | 0660); + sp = shmat(shmid, NULL, 0); + st = *sp == valid3? 1: 0; + shmdt(sp); + exit(st); + } + + waitpid(pid3, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if (result == 3) { + printf("OK\n"); + } + else { + printf("NG\n"); + } + + printf("C926T05... "); + fflush(stdout); + valid1 = 1; + valid2 = 1; + valid3 = 1; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, p) == -1) { + perror("socketpair"); + exit(1); + } + + if ((pid1 = fork()) == 0) { + close(p[0]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 0 + sp = shmat(shmid, NULL, 0); + *sp = 1; + // step 1 + shmctl(shmid, IPC_RMID, &buf); + // step2 + st = *sp == valid1? 1: 0; + shmdt(sp); + write(p[1], &c, 1); + exit(st); + } + + if ((pid2 = fork()) == 0) { + close(p[1]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 3 + read(p[0], &c, 1); + sp = shmat(shmid, NULL, 0); + (*sp)++; + // step 4 + st = *sp == valid2? 1: 0; + shmdt(sp); + exit(st); + } + + close(p[0]); + close(p[1]); + result = 0; + waitpid(pid1, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + waitpid(pid2, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if ((pid3 = fork()) == 0) { + // step 5 + shmid = shmget(key, 4096, IPC_CREAT | 0660); + sp = shmat(shmid, NULL, 0); + st = *sp == valid3? 1: 0; + shmdt(sp); + exit(st); + } + + waitpid(pid3, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if (result == 3) { + printf("OK\n"); + } + else { + printf("NG\n"); + } + + printf("C926T06... "); + fflush(stdout); + valid1 = 1; + valid2 = 1; + valid3 = 1; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, p) == -1) { + perror("socketpair"); + exit(1); + } + + if ((pid1 = fork()) == 0) { + close(p[0]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 0 + sp = shmat(shmid, NULL, 0); + *sp = 1; + // step 1 + shmctl(shmid, IPC_RMID, &buf); + // step2 + st = *sp == valid1? 1: 0; + exit(st); + } + + if ((pid2 = fork()) == 0) { + close(p[1]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 3 + read(p[0], &c, 1); + sp = shmat(shmid, NULL, 0); + (*sp)++; + // step 4 + st = *sp == valid2? 1: 0; + shmdt(sp); + exit(st); + } + + close(p[0]); + close(p[1]); + result = 0; + waitpid(pid1, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + waitpid(pid2, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if ((pid3 = fork()) == 0) { + // step 5 + shmid = shmget(key, 4096, IPC_CREAT | 0660); + sp = shmat(shmid, NULL, 0); + st = *sp == valid3? 1: 0; + shmdt(sp); + exit(st); + } + + waitpid(pid3, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if (result == 3) { + printf("OK\n"); + } + else { + printf("NG\n"); + } + + printf("C926T07... "); + fflush(stdout); + valid1 = 2; + valid2 = 2; + valid3 = 0; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, p) == -1) { + perror("socketpair"); + exit(1); + } + + if ((pid1 = fork()) == 0) { + close(p[0]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 0 + sp = shmat(shmid, NULL, 0); + *sp = 1; + write(p[1], &c, 1); + // step 2 + read(p[1], &c, 1); + shmctl(shmid, IPC_RMID, &buf); + // step2 + st = *sp == valid1? 1: 0; + exit(st); + } + + if ((pid2 = fork()) == 0) { + close(p[1]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 1 + read(p[0], &c, 1); + sp = shmat(shmid, NULL, 0); + (*sp)++; + write(p[0], &c, 1); + // step 3 + read(p[0], &c, 1); + st = *sp == valid2? 1: 0; + shmdt(sp); + // step 4 + exit(st); + } + + close(p[0]); + close(p[1]); + result = 0; + waitpid(pid1, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + waitpid(pid2, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if ((pid3 = fork()) == 0) { + // step 5 + shmid = shmget(key, 4096, IPC_CREAT | 0660); + sp = shmat(shmid, NULL, 0); + st = *sp == valid3? 1: 0; + shmdt(sp); + exit(st); + } + + waitpid(pid3, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if (result == 3) { + printf("OK\n"); + } + else { + printf("NG\n"); + } + + printf("C926T08... "); + fflush(stdout); + valid1 = 2; + valid2 = 2; + valid3 = 2; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, p) == -1) { + perror("socketpair"); + exit(1); + } + + if ((pid1 = fork()) == 0) { + close(p[0]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 0 + sp = shmat(shmid, NULL, 0); + *sp = 1; + write(p[1], &c, 1); + // step 2 + read(p[1], &c, 1); + // step2 + st = *sp == valid1? 1: 0; + exit(st); + } + + if ((pid2 = fork()) == 0) { + close(p[1]); + shmid = shmget(key, 4096, IPC_CREAT | 0660); + // step 1 + read(p[0], &c, 1); + sp = shmat(shmid, NULL, 0); + (*sp)++; + write(p[0], &c, 1); + // step 3 + read(p[0], &c, 1); + st = *sp == valid2? 1: 0; + shmdt(sp); + // step 4 + exit(st); + } + + close(p[0]); + close(p[1]); + result = 0; + waitpid(pid1, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + waitpid(pid2, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if ((pid3 = fork()) == 0) { + // step 5 + shmid = shmget(key, 4096, IPC_CREAT | 0660); + sp = shmat(shmid, NULL, 0); + st = *sp == valid3? 1: 0; + shmdt(sp); + exit(st); + } + + waitpid(pid3, &st, 0); + if (WIFEXITED(st)) + result += WEXITSTATUS(st); + + if (result == 3) { + printf("OK\n"); + } + else { + printf("NG\n"); + } + + exit(0); +} diff --git a/test/issues/926/C926.txt b/test/issues/926/C926.txt new file mode 100644 index 00000000..f77bf070 --- /dev/null +++ b/test/issues/926/C926.txt @@ -0,0 +1,15 @@ +スクリプトは Wed Jun 6 14:39:24 2018 + に開始しました[?1034hbash-4.2$ ./mcexec C./C926 +C926T01... OK +C926T02... OK +C926T03... OK +C926T04... OK +C926T05... OK +C926T06... OK +C926T07... OK +C926T08... OK +bash-4.2$ exit +exit + +スクリプトは Wed Jun 6 14:39:38 2018 + に終了しました \ No newline at end of file