From 3432f46d8b05fe52d670ad31e7af87b4f37502db Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Thu, 1 Mar 2018 15:41:58 +0900 Subject: [PATCH] fix & add: testcases for refs #885, refs #1031 --- test/mng_mod/issues/1031/CT_009.c | 2 +- test/mng_mod/issues/1031/README | 22 +++---- test/mng_mod/issues/885/CT_001.c | 6 ++ test/mng_mod/issues/885/CT_002.c | 6 ++ test/mng_mod/issues/885/CT_004.c | 18 ++--- test/mng_mod/issues/885/CT_005.c | 5 ++ test/mng_mod/issues/885/CT_006.c | 6 ++ test/mng_mod/issues/885/CT_007.c | 6 ++ test/mng_mod/issues/885/CT_008.c | 6 ++ test/mng_mod/issues/885/CT_009.c | 6 ++ test/mng_mod/issues/885/CT_010.c | 100 ++++++++++++++++++++++++++++ test/mng_mod/issues/885/CT_011.c | 102 +++++++++++++++++++++++++++++ test/mng_mod/issues/885/Makefile | 10 ++- test/mng_mod/issues/885/README | 53 ++++++++++----- test/mng_mod/issues/885/result.log | 14 ++++ 15 files changed, 320 insertions(+), 42 deletions(-) create mode 100644 test/mng_mod/issues/885/CT_010.c create mode 100644 test/mng_mod/issues/885/CT_011.c diff --git a/test/mng_mod/issues/1031/CT_009.c b/test/mng_mod/issues/1031/CT_009.c index 3eaff8ba..0c26e9f0 100644 --- a/test/mng_mod/issues/1031/CT_009.c +++ b/test/mng_mod/issues/1031/CT_009.c @@ -24,7 +24,7 @@ int main(int argc, char** argv) } OKNG(tmp_flag != 1, "check SIGKILL act"); - rc = sigaction(SIGKILL, NULL, &old_act); + rc = sigaction(SIGSTOP, NULL, &old_act); OKNG(rc != 0, "sigaction to get SIGSTOP action"); tmp_flag = 0; diff --git a/test/mng_mod/issues/1031/README b/test/mng_mod/issues/1031/README index e43afdc2..de379b8c 100644 --- a/test/mng_mod/issues/1031/README +++ b/test/mng_mod/issues/1031/README @@ -63,29 +63,29 @@ CT_005: 複数回(非上書き)のSIG_RESETHAND 指定時の動作 CT_006: 設定中のハンドラ情報の取得 (上書き時) 1. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 - 2. sigaction(SIGUSR1, NULL, &act) で設定情報を取得 + 2. sigaction(SIGUSR1, NULL, &act) で設定情報を取得できる 3. SIG_RESETHANDを指定しないsigaction()でSIG_USR1にデフォルトハンドラを設定 - 4. sigaction(SIGUSR1, NULL, &act) で設定情報を取得 + 4. sigaction(SIGUSR1, NULL, &act) で3.で指定した設定情報を取得できる CT_007: 設定中のハンドラ情報の取得 (デフォルトに戻った時) 1. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 2. 自身にSIGUSR1を送る 3. 1.で登録したハンドラが呼び出される - 4. sigaction(SIGUSR1, NULL, &act) で設定情報を取得 + 4. sigaction(SIGUSR1, NULL, &act) で設定情報を取得できる CT_008: 不正なsig_numへのハンドラ登録 - 1. 範囲外(上限、下限)のsignumへのハンドラ登録 - 2. SIGKILL, SIGSTOPへのハンドラ登録 + 1. 範囲外(上限、下限)のsignumへのハンドラ登録が失敗する + 2. SIGKILL, SIGSTOPへのハンドラ登録が失敗する CT_009: SIGKILL, SIGSTOPのハンドラ情報の取得 - 1. sigaction(SIGKILL, NULL, &act) で設定情報を取得 - 2. sigaction(SIGSTOP, NULL, &act) で設定情報を取得 + 1. sigaction(SIGKILL, NULL, &act) で設定情報を取得できる + 2. sigaction(SIGSTOP, NULL, &act) で設定情報を取得できる CT_010: sig_numの有効確認 - 1. sigaction(SIGUSR1, NULL, NULL) で有効かどうかを確認 - 2. sigaction(SIGKILL, NULL, NULL) で有効かどうかを確認 - 3. sigaction(SIGSTOP, NULL, NULL) で有効かどうかを確認 - 4. sigaction(_NSIG, NULL, NULL) で有効かどうかを確認 + 1. sigaction(SIGUSR1, NULL, NULL) が成功する(有効) + 2. sigaction(SIGKILL, NULL, NULL) が成功する(有効) + 3. sigaction(SIGSTOP, NULL, NULL) が成功する(有効) + 4. sigaction(_NSIG, NULL, NULL) が失敗する(無効) 3. 結果 テストプログラムの実行結果をresult.log に示す。 diff --git a/test/mng_mod/issues/885/CT_001.c b/test/mng_mod/issues/885/CT_001.c index c813f512..f7479a2e 100644 --- a/test/mng_mod/issues/885/CT_001.c +++ b/test/mng_mod/issues/885/CT_001.c @@ -65,6 +65,12 @@ int main(int argc, char** argv) /* detach child */ rc = ptrace(PTRACE_DETACH, pid, NULL, NULL); OKNG(rc != 0, "ptrace_detach"); + + /* wait child's exit */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child is not exited"); } printf("*** %s PASSED\n\n", TEST_NAME); diff --git a/test/mng_mod/issues/885/CT_002.c b/test/mng_mod/issues/885/CT_002.c index db5a475a..6fe97d3d 100644 --- a/test/mng_mod/issues/885/CT_002.c +++ b/test/mng_mod/issues/885/CT_002.c @@ -65,6 +65,12 @@ int main(int argc, char** argv) /* continue child */ rc = ptrace(PTRACE_CONT, pid, NULL, NULL); OKNG(rc != 0, "ptrace_cont"); + + /* wait child's exit */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child is not exited"); } printf("*** %s PASSED\n\n", TEST_NAME); diff --git a/test/mng_mod/issues/885/CT_004.c b/test/mng_mod/issues/885/CT_004.c index 841f73d3..d02f6143 100644 --- a/test/mng_mod/issues/885/CT_004.c +++ b/test/mng_mod/issues/885/CT_004.c @@ -91,18 +91,6 @@ int main(int argc, char** argv) rc = waitpid(pid, &status, 0); CHKANDJUMP(rc == -1, "waitpid"); -if (WIFEXITED(status)) { -printf("exited:%d\n", WEXITSTATUS(status)); -} - -if (WIFSIGNALED(status)) { -printf("signaled\n"); -} - -if (WIFCONTINUED(status)) { -printf("continued\n"); -} - CHKANDJUMP(!WIFSTOPPED(status), "child is not stopped again"); /* detach child */ @@ -111,6 +99,12 @@ printf("continued\n"); /* wake child */ sem_post(cwait); + + /* wait child's exit */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child is not exited"); } printf("*** %s PASSED\n\n", TEST_NAME); diff --git a/test/mng_mod/issues/885/CT_005.c b/test/mng_mod/issues/885/CT_005.c index d8c25ead..6a87f7e2 100644 --- a/test/mng_mod/issues/885/CT_005.c +++ b/test/mng_mod/issues/885/CT_005.c @@ -64,6 +64,11 @@ int main(int argc, char** argv) /* wake child */ sem_post(cwait); + /* wait child's exit */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child is not exited"); } printf("*** %s PASSED\n\n", TEST_NAME); diff --git a/test/mng_mod/issues/885/CT_006.c b/test/mng_mod/issues/885/CT_006.c index 28fcac46..6a914954 100644 --- a/test/mng_mod/issues/885/CT_006.c +++ b/test/mng_mod/issues/885/CT_006.c @@ -69,6 +69,12 @@ int main(int argc, char** argv) /* detach child */ rc = ptrace(PTRACE_DETACH, pid, NULL, NULL); OKNG(rc != 0, "ptrace_detach"); + + /* wait child's exit */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child is not exited"); } printf("*** %s PASSED\n\n", TEST_NAME); diff --git a/test/mng_mod/issues/885/CT_007.c b/test/mng_mod/issues/885/CT_007.c index 36b480fb..14e84afa 100644 --- a/test/mng_mod/issues/885/CT_007.c +++ b/test/mng_mod/issues/885/CT_007.c @@ -57,6 +57,12 @@ int main(int argc, char** argv) /* wake child */ sem_post(cwait); + + /* wait child's exit */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child is not exited"); } printf("*** %s PASSED\n\n", TEST_NAME); diff --git a/test/mng_mod/issues/885/CT_008.c b/test/mng_mod/issues/885/CT_008.c index 56a8e1c3..fd35e1b1 100644 --- a/test/mng_mod/issues/885/CT_008.c +++ b/test/mng_mod/issues/885/CT_008.c @@ -68,6 +68,12 @@ int main(int argc, char** argv) /* wake child */ sem_post(cwait); + /* wait child's exit */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child is not exited"); + } printf("*** %s PASSED\n\n", TEST_NAME); diff --git a/test/mng_mod/issues/885/CT_009.c b/test/mng_mod/issues/885/CT_009.c index 6880c478..4e2bd6cc 100644 --- a/test/mng_mod/issues/885/CT_009.c +++ b/test/mng_mod/issues/885/CT_009.c @@ -75,6 +75,12 @@ int main(int argc, char** argv) /* wake child */ sem_post(cwait); + + /* wait child's exit */ + rc = waitpid(pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child is not exited"); } printf("*** %s PASSED\n\n", TEST_NAME); diff --git a/test/mng_mod/issues/885/CT_010.c b/test/mng_mod/issues/885/CT_010.c new file mode 100644 index 00000000..ae70fdfe --- /dev/null +++ b/test/mng_mod/issues/885/CT_010.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "./test_chk.h" + +#define TEST_NAME "CT_010" + +int main(int argc, char** argv) +{ + pid_t tracer_pid = 0, tracee_pid =0; + sem_t *pwait = NULL; + sem_t *tracer_wait = NULL; + sem_t *tracee_wait = NULL; + void *mem, *attach; + int rc = 0; + int status; + + printf("*** %s start *******************************\n", TEST_NAME); + + pwait = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + tracer_wait = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + tracee_wait = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + + CHKANDJUMP(!pwait || !tracer_wait || !tracee_wait, "mmap for sem"); + + rc |= sem_init(pwait, 1, 0); + rc |= sem_init(tracer_wait, 1, 0); + rc |= sem_init(tracee_wait, 1, 0); + + CHKANDJUMP(rc, "sem_init"); + + tracee_pid = fork(); + CHKANDJUMP(tracee_pid == -1, "fork tracee"); + + if (tracee_pid == 0) { /* tracee */ + /* wake tracer*/ + sem_post(tracer_wait); + + /* wait */ + sem_wait(tracee_wait); + + _exit(123); + } else { /* parent */ + tracer_pid = fork(); + CHKANDJUMP(tracer_pid == -1, "fork tracer"); + if (tracer_pid == 0) { /* tracer */ + /* wait */ + sem_wait(tracer_wait); + + /* attach tracee */ + rc = ptrace(PTRACE_ATTACH, tracee_pid, NULL, NULL); + OKNG(rc != 0, "ptrace_attach by tracer"); + + /* wake tracee */ + sem_post(tracee_wait); + + /* wait tracee stop */ + rc = waitpid(tracee_pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFSTOPPED(status), "tracee is not stopped"); + + /* detach tracee */ + rc = ptrace(PTRACE_DETACH, tracee_pid, NULL, NULL); + OKNG(rc != 0, "ptrace_detach by tracer"); + + /* wait after detach (failed)*/ + rc = waitpid(tracee_pid, &status, 0); + OKNG(rc != -1, "waitpid by tracer after detach (failed)"); + + _exit(234); + } else { /* parent */ + rc = waitpid(tracee_pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + OKNG(!WIFEXITED(status), "waitpid for tracee by parent"); + + rc = waitpid(tracer_pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child(tracer) is not exited"); + } + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/885/CT_011.c b/test/mng_mod/issues/885/CT_011.c new file mode 100644 index 00000000..24879138 --- /dev/null +++ b/test/mng_mod/issues/885/CT_011.c @@ -0,0 +1,102 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "./test_chk.h" + +#define TEST_NAME "CT_011" + +int main(int argc, char** argv) +{ + pid_t tracer_pid = 0, tracee_pid =0; + sem_t *pwait = NULL; + sem_t *tracer_wait = NULL; + sem_t *tracee_wait = NULL; + void *mem, *attach; + int rc = 0; + int status; + + printf("*** %s start *******************************\n", TEST_NAME); + + pwait = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + tracer_wait = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + tracee_wait = (sem_t *)mmap(NULL, sizeof(sem_t), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + + CHKANDJUMP(!pwait || !tracer_wait || !tracee_wait, "mmap for sem"); + + rc |= sem_init(pwait, 1, 0); + rc |= sem_init(tracer_wait, 1, 0); + rc |= sem_init(tracee_wait, 1, 0); + + CHKANDJUMP(rc, "sem_init"); + + tracee_pid = fork(); + CHKANDJUMP(tracee_pid == -1, "fork tracee"); + + if (tracee_pid == 0) { /* tracee */ + /* wake tracer*/ + sem_post(tracer_wait); + + /* wait */ + sem_wait(tracee_wait); + + _exit(123); + } else { /* parent */ + tracer_pid = fork(); + CHKANDJUMP(tracer_pid == -1, "fork tracer"); + if (tracer_pid == 0) { /* tracer */ + /* wait */ + sem_wait(tracer_wait); + + /* attach tracee */ + rc = ptrace(PTRACE_ATTACH, tracee_pid, NULL, NULL); + OKNG(rc != 0, "ptrace_attach"); + + /* wake tracee */ + sem_post(tracee_wait); + + /* wait tracee stop */ + rc = waitpid(tracee_pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFSTOPPED(status), "tracee is not stopped"); + + /* continue child */ + rc = ptrace(PTRACE_CONT, tracee_pid, NULL, NULL); + OKNG(rc != 0, "ptrace_cont"); + + /* wait tracee's exit */ + rc = waitpid(tracee_pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + OKNG(!WIFEXITED(status), "waitpid for tracee by tracer without detach"); + + _exit(234); + } else { /* parent */ + rc = waitpid(tracee_pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + OKNG(!WIFEXITED(status), "waitpid for tracee by parent"); + + rc = waitpid(tracer_pid, &status, 0); + CHKANDJUMP(rc == -1, "waitpid"); + + CHKANDJUMP(!WIFEXITED(status), "child(tracer) is not exited"); + } + } + + printf("*** %s PASSED\n\n", TEST_NAME); + return 0; + +fn_fail: + printf("*** %s FAILED\n\n", TEST_NAME); + + return -1; +} diff --git a/test/mng_mod/issues/885/Makefile b/test/mng_mod/issues/885/Makefile index 8c7f0f8d..67b0b2e1 100644 --- a/test/mng_mod/issues/885/Makefile +++ b/test/mng_mod/issues/885/Makefile @@ -2,7 +2,7 @@ CC = gcc MCK_DIR=/home/satoken/ppos MCEXEC=$(MCK_DIR)/bin/mcexec -TARGET=CT_001 CT_002 CT_003 CT_004 CT_005 CT_006 CT_007 CT_008 CT_009 +TARGET=CT_001 CT_002 CT_003 CT_004 CT_005 CT_006 CT_007 CT_008 CT_009 CT_010 CT_011 CPPFLAGS = LDFLAGS = -pthread @@ -36,6 +36,12 @@ CT_008: CT_008.c CT_009: CT_009.c $(CC) -o $@ $^ $(LDFLAGS) +CT_010: CT_010.c + $(CC) -o $@ $^ $(LDFLAGS) + +CT_011: CT_011.c + $(CC) -o $@ $^ $(LDFLAGS) + test: all $(MCEXEC) ./CT_001 $(MCEXEC) ./CT_002 @@ -47,6 +53,8 @@ test: all $(MCEXEC) ./CT_007 $(MCEXEC) ./CT_008 $(MCEXEC) ./CT_009 + $(MCEXEC) ./CT_010 + $(MCEXEC) ./CT_011 clean: rm -f $(TARGET) *.o diff --git a/test/mng_mod/issues/885/README b/test/mng_mod/issues/885/README index 3d29c814..4652341c 100644 --- a/test/mng_mod/issues/885/README +++ b/test/mng_mod/issues/885/README @@ -21,43 +21,62 @@ McKernelでのptraceのattach/detach操作の基本動作確認(9項目)の 2. テスト項目 CT_001: 通常のattach detach 操作 1. 親プロセスが子プロセスにattach - 2. 親プロセスが子プロセスをdetach - 3. 子プロセスが終了 - 4. 親プロセスがwait()で子プロセスの終了を回収 + 2. 親プロセスがwait()で子プロセスの停止を回収 + 3. 親プロセスが子プロセスをdetach + 4. 子プロセスが終了 + 5. 親プロセスがwait()で子プロセスの終了を回収 CT_002: tracee(子プロセス)がdetachせずに終了 1. 親プロセスが子プロセスにattach - 2. 子プロセスが終了 - 3. 親プロセスがwait()で子プロセスの終了を回収 + 2. 親プロセスがwait()で子プロセスの停止を回収 + 3. 親プロセスが子プロセスに再開指示(ptrace_cont) + 4. 子プロセスが終了 + 5. 親プロセスがwait()で子プロセスの終了を回収 CT_003: tracer(親プロセス)がdetachしないまま先に終了 1. 親プロセスが子プロセスにattach - 2. 親プロセスが子プロセスに再開指示した直後に終了 - 3. 子プロセスが終了 + 2. 親プロセスがwait()で子プロセスの停止を回収 + 3. 親プロセスが子プロセスに再開指示した直後に終了 + 4. 子プロセスが終了 CT_004: 複数回のattach -> detach 操作 1. 親プロセスが子プロセスにattach - 2. 親プロセスが子プロセスにdetach - 3. 再び、親プロセスが子プロセスにattach - 4. 親プロセスが子プロセスにdetach + 2. 親プロセスがwait()で子プロセスの停止を回収 + 3. 親プロセスが子プロセスにdetach + 4. 再び、親プロセスが子プロセスにattach + 5. 親プロセスがwait()で子プロセスの停止を回収 + 6. 親プロセスが子プロセスにdetach + 7. 親プロセスがwait()で子プロセスの終了を回収 CT_005: 不正なpid指定のattach - 1. 不正なpid(0, 1, 負数)を指定したattach - 2. 自身のpidを指定したattach + 1. 不正なpid(0, 1, 負数)を指定したattachが失敗 + 2. 自身のpidを指定したattachが失敗 CT_006: attach済の子プロセスへのattach① - 1. 既にattachしている子プロセスへ再びattach + 1. 既にattachしている子プロセスへ再びattachが失敗 CT_007: attach済の子プロセスへのattach② - 1. tracemeした子プロセスへattach + 1. tracemeした子プロセスへattachが失敗 CT_008: 不正なpid指定のdetach - 1. 不正なpid(0, 1, 負数)を指定したdetach - 2. attachしていない子プロセスのpidを指定したdetach + 1. 不正なpid(0, 1, 負数)を指定したdetachが失敗 + 2. attachしていない子プロセスのpidを指定したdetachが失敗 + 3. 自身のpidを指定したattachが失敗 CT_009: detach済の子プロセスへのdetach 1. 既にdetachしていいる子プロセスへ再びdetach +CT_010: 親子関係ではないプロセス間でのattach + 1. 親プロセスが2つの子プロセス(tracerプロセス, traceeプロセスとする)をforkする + 2. tracerプロセスがtraceeプロセスをattach + 3. tracerプロセスがwait()でtraceeプロセスの停止を回収 + 4. tracerプロセスがtraceeプロセスに再開を指示 + 5. traceeプロセスが終了する + 6. tracerプロセスがtraceeプロセスにdetach + 7. tracerプロセスがwait()でtraceeプロセスの終了を回収 + 8. tracerプロセスが終了 + 9. 親プロセスがwait()でtracee,tracerプロセスの終了を回収 + 3. 結果 テストプログラムの実行結果をresult.log に示す。 -上記の10項目がPASSしていることを確認した。 +上記の11項目がPASSしていることを確認した。 diff --git a/test/mng_mod/issues/885/result.log b/test/mng_mod/issues/885/result.log index a9aeac7c..e6e0e83e 100644 --- a/test/mng_mod/issues/885/result.log +++ b/test/mng_mod/issues/885/result.log @@ -75,4 +75,18 @@ RESULT: ok [OK] ptrace_detach faild [double detach] *** CT_009 PASSED +/home/satoken/ppos/bin/mcexec ./CT_010 +*** CT_010 start ******************************* + [OK] ptrace_attach by tracer + [OK] ptrace_detach by tracer + [OK] waitpid by tracer after detach (failed) + [OK] waitpid for tracee by parent +*** CT_010 PASSED +/home/satoken/ppos/bin/mcexec ./CT_011 +*** CT_011 start ******************************* + [OK] ptrace_attach + [OK] ptrace_cont + [OK] waitpid for tracee by tracer without detach + [OK] waitpid for tracee by parent +*** CT_011 PASSED