sigaction: support for SA_RESETHAND on x86_64

refs #1031
This commit is contained in:
Ken Sato
2018-02-22 11:55:32 +09:00
parent 98df469d29
commit 523a066245
2 changed files with 96 additions and 0 deletions

View File

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

View File

@ -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していることを確認した。