From 523a066245fe953970f7186eb4db459bc99e4736 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Thu, 22 Feb 2018 11:55:32 +0900 Subject: [PATCH] sigaction: support for SA_RESETHAND on x86_64 refs #1031 --- arch/x86_64/kernel/syscall.c | 5 ++ test/mng_mod/issues/1031/README | 91 +++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 test/mng_mod/issues/1031/README diff --git a/arch/x86_64/kernel/syscall.c b/arch/x86_64/kernel/syscall.c index e11b0e92..5e20d480 100644 --- a/arch/x86_64/kernel/syscall.c +++ b/arch/x86_64/kernel/syscall.c @@ -809,6 +809,11 @@ do_signal(unsigned long rc, void *regs0, struct thread *thread, struct sig_pendi regs->gpr.rip = (unsigned long)k->sa.sa_handler; regs->gpr.rsp = (unsigned long)usp; + // check signal handler is ONESHOT + if (k->sa.sa_flags & SA_RESETHAND) { + k->sa.sa_handler = SIG_DFL; + } + if(!(k->sa.sa_flags & SA_NODEFER)) thread->sigmask.__val[0] |= pending->sigmask.__val[0]; kfree(pending); diff --git a/test/mng_mod/issues/1031/README b/test/mng_mod/issues/1031/README new file mode 100644 index 00000000..b6e34493 --- /dev/null +++ b/test/mng_mod/issues/1031/README @@ -0,0 +1,91 @@ +【Issue#1031 動作確認】 +Issue#1031が解決され、既存機能に影響がないことをIssueで報告されたテストプログラム(1項目)と、 +McKernelでのsigaction()の基本動作確認(10項目)の計11項目のテストによって確認した。 +なお、各テストの実行結果は./result.log として格納している。 + +①Issueで報告されたテストプログラムによる確認 + ・Issue#1031 + 報告で使用されたテストプログラムを用いて、現象が再現しないことを確認した。 + 実行時の出力を./result.log に記載している + +②McKernelでのsigaction()の基本動作確認 +以下の内容で、Issue#1031による変更が既存機能に影響しないことを確認した。 + +基本動作確認の詳細を以下に示す。 + +1. テストの実行方法 + 以下の手順でテストを実行する + 1. Makefileの変数MCK_DIRの内容を、McKernelがインストールされているディレクトリに変更する + 2. sh make test を実行する + +2. テスト項目 +CT_001: SIG_RESETHAND 指定時の動作 + 1. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 + 2. 自身にSIGUSR1を送る + 3. 1.で登録したハンドラが呼び出される + 4. 自身にSIGUSR1を送る + 5. 1.で登録したハンドラが呼び出されず、プロセスが終了する + +CT_002: SIG_RESETHAND 未指定時の動作 + 1. SIG_RESETHANDを指定しないsigaction()でSIGUSR1にハンドラを設定 + 2. 自身にSIGUSR1を送る + 3. 1.で登録したハンドラが呼び出される + 4. 自身にSIGUSR1を送る + 5. 1.で登録したハンドラが呼び出される + +CT_003: SIG_RESETHANDO 指定ハンドラへの上書き登録時の動作 + 1. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 + 2. SIG_RESETHANDを指定しないsigaction()でSIG_USR1にハンドラを設定 + 3. 自身にSIGUSR1を送る + 4. 2.で登録したハンドラが呼び出される + 5. 自身にSIGUSR1を送る + 6. 2.で登録したハンドラが呼び出される + +CT_004: 複数のsig_numへのハンドラ登録時の動作 + 1. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 + 2. SIG_RESETHANDを指定したsigaction()でSIG_USR2にハンドラを設定 + 3. 自身にSIGUSR1を送る + 4. 1.で登録したハンドラが呼び出される + 5. 自身にSIGUSR2を送る + 6. 2.で登録したハンドラが呼び出される + 7. 自身にSIGUSR1を送る + 8. 1.で登録したハンドラが呼び出されず、プロセスが終了する + +CT_005: 複数回(非上書き)のSIG_RESETHAND 指定時の動作 + 1. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 + 2. 自身にSIGUSR1を送る + 3. 1.で登録したハンドラが呼び出される + 4. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 + 5. 自身にSIGUSR1を送る + 6. 4.で登録したハンドラが呼び出される + 7. 自身にSIGUSR1を送る + 8. 4.で登録したハンドラが呼び出されず、プロセスが終了する + +CT_006: 設定中のハンドラ情報の取得 (上書き時) + 1. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 + 2. sigaction(SIGUSR1, NULL, &act) で設定情報を取得 + 3. SIG_RESETHANDを指定しないsigaction()でSIG_USR1にデフォルトハンドラを設定 + 4. sigaction(SIGUSR1, NULL, &act) で設定情報を取得 + +CT_007: 設定中のハンドラ情報の取得 (デフォルトに戻った時) + 1. SIG_RESETHANDを指定したsigaction()でSIG_USR1にハンドラを設定 + 2. 自身にSIGUSR1を送る + 3. 1.で登録したハンドラが呼び出される + 4. sigaction(SIGUSR1, NULL, &act) で設定情報を取得 + +CT_008: 不正なsig_numへのハンドラ登録 + 1. 範囲外(上限、下限)のsignumへのハンドラ登録 + 2. SIGKILL, SIGSTOPへのハンドラ登録 + +CT_009: SIGKILL, SIGSTOPのハンドラ情報の取得 + 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) で有効かどうかを確認 + +3. 結果 +テストプログラムの実行結果をresult.log に示す。 +上記の11項目がPASSしていることを確認した。