From e7b6a3472bf3153dcba283c5dea55d916822db5d Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Thu, 21 Jun 2018 09:08:34 +0900 Subject: [PATCH] sched_getaffinity: Check arguments in the same order as in Linux (1) Check if size is large enough (2) Check if size is positive Fujitsu: POSTK_DEBUG_TEMP_FIX_5 Refs: #1121 Change-Id: I3e41720c89ef89294820f7f4fa8df1a69a7011b0 --- kernel/syscall.c | 12 +--- test/issues/1121/C1121.sh | 108 ++++++++++++++++++++++++++++++++++++ test/issues/1121/Makefile | 14 +++++ test/issues/1121/README | 36 ++++++++++++ test/issues/1121/result.log | 35 ++++++++++++ 5 files changed, 195 insertions(+), 10 deletions(-) create mode 100644 test/issues/1121/C1121.sh create mode 100644 test/issues/1121/Makefile create mode 100644 test/issues/1121/README create mode 100644 test/issues/1121/result.log diff --git a/kernel/syscall.c b/kernel/syscall.c index 489ab1a2..1a640d49 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -6793,22 +6793,14 @@ SYSCALL_DECLARE(sched_getaffinity) int ret; dkprintf("%s() len: %d, mask: %p\n", __FUNCTION__, len, u_cpu_set); -#ifdef POSTK_DEBUG_TEMP_FIX_5 /* sched_getaffinity arguments check add (S64FX_10) */ if (len * 8 < num_processors) { - kprintf("%s:%d Too small buffer.\n", __FILE__, __LINE__); + dkprintf("%s: Too small buffer.\n", __func__); return -EINVAL; } if (len & (sizeof(unsigned long)-1)) { - kprintf("%s:%d Size not align to unsigned long.\n", __FILE__, __LINE__); + dkprintf("%s: Size not align to unsigned long.\n", __func__); return -EINVAL; } -#else /* POSTK_DEBUG_TEMP_FIX_5 */ - if (!len || u_cpu_set == (cpu_set_t *)-1) - return -EINVAL; - - if ((len * BITS_PER_BYTE) < __CPU_SETSIZE) - return -EINVAL; -#endif /* POSTK_DEBUG_TEMP_FIX_5 */ len = MIN2(len, sizeof(k_cpu_set)); diff --git a/test/issues/1121/C1121.sh b/test/issues/1121/C1121.sh new file mode 100644 index 00000000..e4baaa81 --- /dev/null +++ b/test/issues/1121/C1121.sh @@ -0,0 +1,108 @@ +#!/bin/sh +BIN= +SBIN= +OSTEST= +LTP= +BOOTPARAM="-c 1-7,9-15,17-23,25-31 -m 10G@0,10G@1 -r 1-7:0+9-15:8+17-23:16+25-31:24" + +if [ -f ../../../config.h ]; then + str=`grep "^#define BINDIR " ../../../config.h | head -1 | sed 's/^#define BINDIR /BINDIR=/'` + eval $str +fi +if [ "x$BINDIR" = x ];then + BINDIR="$BIN" +fi + +if [ -f ../../../Makefile ]; then + str=`grep ^SBINDIR ../../../Makefile | head -1 | sed 's/ //g'` + eval $str +fi +if [ "x$SBINDIR" = x ];then + SBINDIR="$SBIN" +fi + +if [ -f $HOME/ltp/testcases/bin/sched_setaffinity01 ]; then + LTPDIR=$HOME/ltp/testcases +fi +if [ "x$LTPDIR" = x ]; then + LTPDIR="$LTP" +fi + +if [ -f $HOME/ostest/bin/test_mck ]; then + OSTESTDIR=$HOME/ostest/ +fi +if [ "x$OSTESTDIR" = x ]; then + OSTESTDIR="$OSTEST" +fi + +if [ ! -x $SBINDIR/mcstop+release.sh ]; then + echo mcstop+releas: not found >&2 + exit 1 +fi +echo -n "mcstop+release.sh ... " +sudo $SBINDIR/mcstop+release.sh +echo "done" + +if [ ! -x $SBINDIR/mcreboot.sh ]; then + echo mcreboot: not found >&2 + exit 1 +fi +echo -n "mcreboot.sh $BOOTPARAM ... " +sudo $SBINDIR/mcreboot.sh $BOOTPARAM +echo "done" + +if [ ! -x $BINDIR/mcexec ]; then + echo mcexec: not found >&2 + exit 1 +fi + +tid=001 +echo "*** RT_$tid start *******************************" +sudo $BINDIR/mcexec $OSTESTDIR/bin/test_mck -s sched_setaffinity -n 0 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep "RESULT: ok" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" + +tid=002 +echo "*** RT_$tid start *******************************" +sudo $BINDIR/mcexec $OSTESTDIR/bin/test_mck -s sched_setaffinity -n 1 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep "RESULT: ok" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" + +tid=003 +echo "*** RT_$tid start *******************************" +sudo $BINDIR/mcexec $OSTESTDIR/bin/test_mck -s sched_getaffinity -n 3 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep "RESULT: ok" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" + +tid=004 +echo "*** RT_$tid start *******************************" +sudo $BINDIR/mcexec $OSTESTDIR/bin/test_mck -s sched_getaffinity -n 5 -- -p 20 2>&1 | tee ./RT_${tid}.txt +if grep "RESULT: ok" ./RT_${tid}.txt > /dev/null 2>&1 ; then + echo "*** RT_$tid: PASSED" +else + echo "*** RT_$tid: FAILED" +fi +echo "" + +tid=001 +echo "*** LT_$tid start *******************************" +sudo $BINDIR/mcexec $LTPDIR/bin/sched_setaffinity01 2>&1 | tee ./LT_${tid}.txt +ok=`grep TPASS LT_${tid}.txt | wc -l` +ng=`grep TFAIL LT_${tid}.txt | wc -l` +if [ $ng = 0 ]; then + echo "*** LT_$tid: PASSED (ok:$ok)" +else + echo "*** LT_$tid: FAILED (ok:$ok, ng:$ng)" +fi diff --git a/test/issues/1121/Makefile b/test/issues/1121/Makefile new file mode 100644 index 00000000..8bffde81 --- /dev/null +++ b/test/issues/1121/Makefile @@ -0,0 +1,14 @@ +CC = gcc +TARGET= + +CPPFLAGS = +LDFLAGS = + +all: $(TARGET) + +test: all + @sh ./C1121.sh + +clean: + rm -f $(TARGET) *.o + diff --git a/test/issues/1121/README b/test/issues/1121/README new file mode 100644 index 00000000..2a1d7bfb --- /dev/null +++ b/test/issues/1121/README @@ -0,0 +1,36 @@ +【Issue#1121 動作確認】 +□ テスト内容 +1. Issueで報告された再現プログラムでの確認 +RT_001: ostest-sched_setaffinity.000 + 自プロセスのaffinityの設定と取得が行えることを確認 + +RT_002: ostest-sched_setaffinity.001 + 自プロセスのaffinityを設定し、CPUのmigrateができることを確認 + +RT_003: ostest-sched_getaffinity.003 + 存在しないプロセスIDを指定したsched_getaffinity()を実行し、 + -1 が返り、errnoにESRCH が設定されることを確認 + +RT_004: ostest-sched_getaffinity.005 + 子プロセスを生成し、以下を確認 + - 子プロセスが親プロセスのaffinityを取得 + - 子プロセスが自プロセスのaffinityを取得 + - 親プロセス、自プロセスから取得したaffinityが等しいことを確認 + +2. 既存のsched_setaffinity機能に影響がないことをLTPを用いて確認 +LT_001: ltp-sched_setaffinity01 + 異常な引数を指定した際に返される値と + 設定されるerrnoが正しいことを確認 (OK 4件) + +□ 実行手順 +$ make test + +実行できない場合は、C1121.shの以下の行を適切に書き換えた後に実行。 +BIN= mcexec が存在するパス +SBIN= mcreboot.sh が存在するパス +OSTEST= OSTESTが存在するパス +LTP= LTPが存在するパス + +□ 実行結果 +result.log 参照。 +すべての項目をPASSしていることを確認。 diff --git a/test/issues/1121/result.log b/test/issues/1121/result.log new file mode 100644 index 00000000..be301168 --- /dev/null +++ b/test/issues/1121/result.log @@ -0,0 +1,35 @@ +*** RT_001 start ******************************* +TEST_SUITE: sched_setaffinity +TEST_NUMBER: 0 +ARGS: -p 20 +RESULT: ok +*** RT_001: PASSED + +*** RT_002 start ******************************* +TEST_SUITE: sched_setaffinity +TEST_NUMBER: 1 +ARGS: -p 20 +RESULT: ok +*** RT_002: PASSED + +*** RT_003 start ******************************* +TEST_SUITE: sched_getaffinity +TEST_NUMBER: 3 +ARGS: -p 20 +sched_getaffinity result:-1, errno:3 (expect error is "ESRCH"=3) +RESULT: ok +*** RT_003: PASSED + +*** RT_004 start ******************************* +TEST_SUITE: sched_getaffinity +TEST_NUMBER: 5 +ARGS: -p 20 +RESULT: ok +*** RT_004: PASSED + +*** LT_001 start ******************************* +sched_setaffinity01 1 TPASS : expected failure with 'Bad address' +sched_setaffinity01 2 TPASS : expected failure with 'Invalid argument' +sched_setaffinity01 3 TPASS : expected failure with 'No such process' +sched_setaffinity01 4 TPASS : expected failure with 'Operation not permitted' +*** LT_001: PASSED (ok:4)