set_robust_list: Add error check

set_robust_list is not supported by McKernel.

Change-Id: I1f679e2e4df24139cceb1f2294bc072cb7956002
Refs: 1399
This commit is contained in:
Ken Sato
2020-07-02 08:58:29 +09:00
committed by Masamichi Takagi
parent ebc91cea0e
commit b44b11ace7
7 changed files with 155 additions and 1 deletions

View File

@ -3531,9 +3531,15 @@ SYSCALL_DECLARE(setpgid)
/* Ignore the registration by start_thread() (in pthread_create.c)
because McKernel doesn't unlock mutex-es held by the thread which has been killed. */
#define ROBUST_LIST_HEAD_SIZE 24
SYSCALL_DECLARE(set_robust_list)
{
// Palliative fix. wait for impl.
size_t len = (size_t)ihk_mc_syscall_arg1(ctx);
if (len != ROBUST_LIST_HEAD_SIZE) {
return -EINVAL;
}
return 0;
}

41
test/issues/1399/C1399.sh Executable file
View File

@ -0,0 +1,41 @@
#/bin/sh
USELTP=1
USEOSTEST=0
. ../../common.sh
issue="1399"
tid=01
for tno in 01
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
sudo ${MCEXEC} ./C1399T${tno}
if [ $? -eq 0 ]; then
echo "*** ${tname} PASSED ******************************"
else
echo "*** ${tname} FAILED ******************************"
fi
let tid++
echo ""
done
for tp in set_robust_list01 get_robust_list01
do
tname=`printf "C${issue}T%02d" ${tid}`
echo "*** ${tname} start *******************************"
sudo $MCEXEC $LTPBIN/$tp 2>&1 | tee $tp.txt
ok=`grep PASS $tp.txt | wc -l`
ng=`grep FAIL $tp.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** ${tname} PASSED ($ok)"
else
echo "*** ${tname} FAILED (ok=$ok ng=$ng)"
fi
let tid++
echo ""
done

View File

@ -0,0 +1,36 @@
#include <stdio.h>
#include <unistd.h>
#include <linux/futex.h>
#include <syscall.h>
#include <errno.h>
int main(int argc, void *argv[])
{
struct robust_list_head rlh;
size_t len = sizeof(struct robust_list_head);
int rc = 0, ret = 0;
errno = 0;
rc = syscall(__NR_set_robust_list, &rlh, len + 1);
if (rc == -1 && errno == EINVAL) {
printf("[OK] invalid len (1 greater than correct): EINVAL\n");
} else {
printf("[NG] invalid len (1 greater than correct): Succeed\n");
ret = -1;
goto out;
}
errno = 0;
rc = syscall(__NR_set_robust_list, &rlh, len - 1);
if (rc == -1 && errno == EINVAL) {
printf("[OK] invalid len (1 less than correct): EINVAL\n");
} else {
printf("[NG] invalid len (1 less than correct): Succeed\n");
ret = -1;
goto out;
}
out:
return ret;
}

11
test/issues/1399/Makefile Normal file
View File

@ -0,0 +1,11 @@
CFLAGS=-g
LDFLAGS=
TARGET=C1399T01
all: $(TARGET)
test: all
./C1399.sh
clean:
rm -f $(TARGET) *.o *.txt

24
test/issues/1399/README Normal file
View File

@ -0,0 +1,24 @@
【Issue#1399 動作確認】
□ テスト内容
1. 下記のテストプログラムを実行し、症状が発生しないことを確認する
C1399T01:
1. struct robust_list_head のサイズよりも1大きい値をサイズとして指定して
set_robsut_list を呼び出し、EINVALで失敗することを確認
2. struct robust_list_head のサイズよりも1小さい値をサイズとして指定して
set_robsut_list を呼び出し、EINVALで失敗することを確認
2. 以下のLTPを用いて既存のrobust_list機能に影響が無いことを確認
- set_robst_list01
- get_robst_list01
□ 実行手順
$ make test
McKernelのインストール先や、OSTEST, LTPの配置場所は、
$HOME/.mck_test_config を参照している
.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを
$HOMEにコピーし、適宜編集する
□ 実行結果
x86_64_result.log aarch64_result.log 参照。
すべての項目をPASSしていることを確認。

View File

@ -0,0 +1,18 @@
*** C1399T01 start *******************************
[OK] invalid len (1 greater than correct): EINVAL
[OK] invalid len (1 less than correct): EINVAL
*** C1399T01 PASSED ******************************
*** C1399T02 start *******************************
set_robust_list01 1 TPASS : set_robust_list: retval = -1 (expected -1), errno = 22 (expected 22)
set_robust_list01 2 TPASS : set_robust_list: retval = 0 (expected 0), errno = 0 (expected 0)
*** C1399T02 PASSED (2)
*** C1399T03 start *******************************
get_robust_list01 1 TPASS : get_robust_list failed as expected with EFAULT
get_robust_list01 2 TPASS : get_robust_list failed as expected with EFAULT
get_robust_list01 3 TPASS : get_robust_list failed as expected with ESRCH
get_robust_list01 4 TPASS : get_robust_list succeeded
get_robust_list01 5 TPASS : get_robust_list failed as expected with EPERM
*** C1399T03 PASSED (5)

View File

@ -0,0 +1,18 @@
*** C1399T01 start *******************************
[OK] invalid len (1 greater than correct): EINVAL
[OK] invalid len (1 less than correct): EINVAL
*** C1399T01 PASSED ******************************
*** C1399T02 start *******************************
set_robust_list01 1 TPASS : set_robust_list: retval = -1 (expected -1), errno = 22 (expected 22)
set_robust_list01 2 TPASS : set_robust_list: retval = 0 (expected 0), errno = 0 (expected 0)
*** C1399T02 PASSED (2)
*** C1399T03 start *******************************
get_robust_list01 1 TPASS : get_robust_list failed as expected with EFAULT
get_robust_list01 2 TPASS : get_robust_list failed as expected with EFAULT
get_robust_list01 3 TPASS : get_robust_list failed as expected with ESRCH
get_robust_list01 4 TPASS : get_robust_list succeeded
get_robust_list01 5 TPASS : get_robust_list failed as expected with EPERM
*** C1399T03 PASSED (5)