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
This commit is contained in:
Ken Sato
2018-06-21 09:08:34 +09:00
committed by Dominique Martinet
parent 11756d96ef
commit e7b6a3472b
5 changed files with 195 additions and 10 deletions

View File

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

108
test/issues/1121/C1121.sh Normal file
View File

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

14
test/issues/1121/Makefile Normal file
View File

@ -0,0 +1,14 @@
CC = gcc
TARGET=
CPPFLAGS =
LDFLAGS =
all: $(TARGET)
test: all
@sh ./C1121.sh
clean:
rm -f $(TARGET) *.o

36
test/issues/1121/README Normal file
View File

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

View File

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