diff --git a/kernel/syscall.c b/kernel/syscall.c index 18f512df..c243fd25 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -2477,7 +2477,7 @@ retry_tid: /* TODO: clean-up new */ release_cpuid(cpuid); - return -EFAULT; + return newproc->pid; } /* In a single threaded process TID equals to PID */ diff --git a/test/issues/731/C731.sh b/test/issues/731/C731.sh new file mode 100644 index 00000000..32eeaaa7 --- /dev/null +++ b/test/issues/731/C731.sh @@ -0,0 +1,66 @@ +#!/bin/sh +BIN= +SBIN= +LTP= +BOOTPARAM="-c 1-7,17-23,9-15,25-31 -m 10G@0,10G@1" + +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/fork01 ]; then + LTPDIR=$HOME/ltp/testcases +fi +if [ "x$LTPDIR" = x ]; then + LTPDIR="$LTP" +fi + +if ! lsmod | grep mcctrl > /dev/null 2>&1; then + if [ ! -x $SBINDIR/mcreboot.sh ]; then + echo no mcreboot found >&2 + exit 1 + fi + sudo $SBINDIR/mcreboot.sh $BOOTPARAM +fi + +if [ ! -x $BINDIR/mcexec ]; then + echo no mcexec found >&2 + exit 1 +fi + +sudo $BINDIR/mcexec ./g310a 2>&1 | tee g310a.txt +if grep "fork: Permission denied" g310a.txt > /dev/null 2>&1 ; then + echo "*** C731T001: g310a OK" +else + echo "*** C731T001: g310a NG" +fi + +if [ x$LTPDIR = x ]; then + echo no LTP found >&2 + exit 1 +fi + +for i in 01:002 02:003 03:004 04:005 07:006 08:007; do + tp=`echo $i|sed 's/:.*//'` + id=`echo $i|sed 's/.*://'` + $BINDIR/mcexec $LTPDIR/bin/fork$tp 2>&1 | tee fork$tp.txt + ok=`grep TPASS fork$tp.txt | wc -l` + ng=`grep TFAIL fork$tp.txt | wc -l` + if [ $ng = 0 ]; then + echo "*** C731T$id: fork$tp OK ($ok)" + else + echo "*** C731T$id: fork$tp NG (ok=$ok ng=%ng)" + fi +done diff --git a/test/issues/731/C731.txt b/test/issues/731/C731.txt new file mode 100644 index 00000000..db3bcc6e --- /dev/null +++ b/test/issues/731/C731.txt @@ -0,0 +1,46 @@ +Script started on Thu Jun 28 09:16:36 2018 +bash-4.2$ make test +gcc -o g310a g310a.c -Wall -g +sh ./C731.sh +Error: Failed to open /dev/mcos0. +ERROR: opening /dev/mcos0 +fork(): error with child process after fork +fork: Permission denied +waitpid: No child processes +*** C731T001: g310a OK +fork01 1 TPASS : fork() returned 14513 +fork01 2 TPASS : child pid and fork() return agree: 14513 +*** C731T002: fork01 OK (2) +fork02 0 TINFO : Inside parent +fork02 0 TINFO : Inside child +fork02 0 TINFO : exit status of wait 0 +fork02 1 TPASS : test 1 PASSED +*** C731T003: fork02 OK (1) +fork03 0 TINFO : process id in parent of child from fork : 14669 +fork03 1 TPASS : test 1 PASSED +*** C731T004: fork03 OK (1) +fork04 1 TPASS : Env var TERM unchanged after fork(): xterm +fork04 2 TPASS : Env var NoTSetzWq unchanged after fork(): getenv() does not find variable set +fork04 3 TPASS : Env var TESTPROG unchanged after fork(): FRKTCS04 +*** C731T005: fork04 OK (3) +fork07 0 TINFO : Forking 100 children +fork07 0 TINFO : Forked all 100 children, now collecting +fork07 0 TINFO : Collected all 100 children +fork07 1 TPASS : 100/100 children read correctly from an inheritted fd +*** C731T006: fork07 OK (1) +fork08 0 TINFO : parent forksval: 1 +fork08 0 TINFO : parent forksval: 2 +fork08 0 TINFO : second child got char: b +fork08 1 TPASS : Test passed in childnumber 2 +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 1 TPASS : parent test PASSED +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 2 TPASS : parent test PASSED +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 3 TPASS : parent test PASSED +fork08 0 TINFO : Number of processes forked is 2 +*** C731T007: fork08 OK (4) +bash-4.2$ exit +exit + +Script done on Thu Jun 28 09:17:21 2018 diff --git a/test/issues/731/Makefile b/test/issues/731/Makefile new file mode 100644 index 00000000..80903ca5 --- /dev/null +++ b/test/issues/731/Makefile @@ -0,0 +1,13 @@ +CC=gcc +TARGET=g310a + +all:: $(TARGET) + +g310a: g310a.c + $(CC) -o g310a g310a.c -Wall -g + +test:: $(TARGET) + sh ./C731.sh + +clean:: + rm -f *.o $(TARGET) diff --git a/test/issues/731/README b/test/issues/731/README new file mode 100644 index 00000000..49073d94 --- /dev/null +++ b/test/issues/731/README @@ -0,0 +1,35 @@ +【Issue#731 動作確認】 +□ テスト内容 +1. g310aの実行確認 +C731T001 g310aを実行し、forkが Permission denied でエラーとなることを確認 + +2. 既存fork機能に影響しないことをLTPを用いて確認 +C731T002 fork01 の実行確認 + fork後に子プロセスのプロセスIDが正しいことを確認 (OK 2件) +C731T003 fork02 の実行確認 + fork後にwaitを行い、waitが子プロセスのPIDを返却することを確認(OK 1件) +C731T004 fork03 の実行確認 + 子プロセスがfork後に計算を行えること、また子プロセスでのfork返却値が0で + あることを確認 (OK 1件) +C731T005 fork04 の実行確認 + forkで生成した子プロセスが環境変数を変更しても、親プロセス側の + 環境変数に変化が無いことを確認 (OK 3件) +C731T006 fork07 の実行確認 + forkした子プロセスに、親プロセスからファイルディスクリプタを + 引き継いでいることを確認 (OK 1件) +C731T007 fork08 の実行確認 + forkした複数の子プロセスが、それぞれ親プロセスから引き継いだファイル + ディスクリプタを別個に操作できることを確認 + (ある子プロセスがcloseしても別な子プロセスがI/O可能) (OK 4件) + +□ 実行手順 +$ make test + +実行できない場合は、C731.shの以下の行を適切に書き換えた後に実行。 +BIN= mcexec が存在するパス +SBIN= mcreboot.sh が存在するパス +LTP= LTPが存在するパス + +□ 実行結果 +C731.txt 参照。 +全ての項目が OK となっていることを確認。 diff --git a/test/issues/731/fork01.txt b/test/issues/731/fork01.txt new file mode 100644 index 00000000..cb9724c9 --- /dev/null +++ b/test/issues/731/fork01.txt @@ -0,0 +1,2 @@ +fork01 1 TPASS : fork() returned 14513 +fork01 2 TPASS : child pid and fork() return agree: 14513 diff --git a/test/issues/731/fork02.txt b/test/issues/731/fork02.txt new file mode 100644 index 00000000..53e26b6a --- /dev/null +++ b/test/issues/731/fork02.txt @@ -0,0 +1,4 @@ +fork02 0 TINFO : Inside parent +fork02 0 TINFO : Inside child +fork02 0 TINFO : exit status of wait 0 +fork02 1 TPASS : test 1 PASSED diff --git a/test/issues/731/fork03.txt b/test/issues/731/fork03.txt new file mode 100644 index 00000000..473be852 --- /dev/null +++ b/test/issues/731/fork03.txt @@ -0,0 +1,2 @@ +fork03 0 TINFO : process id in parent of child from fork : 14669 +fork03 1 TPASS : test 1 PASSED diff --git a/test/issues/731/fork04.txt b/test/issues/731/fork04.txt new file mode 100644 index 00000000..22fb266c --- /dev/null +++ b/test/issues/731/fork04.txt @@ -0,0 +1,3 @@ +fork04 1 TPASS : Env var TERM unchanged after fork(): xterm +fork04 2 TPASS : Env var NoTSetzWq unchanged after fork(): getenv() does not find variable set +fork04 3 TPASS : Env var TESTPROG unchanged after fork(): FRKTCS04 diff --git a/test/issues/731/fork07.txt b/test/issues/731/fork07.txt new file mode 100644 index 00000000..5d4b2e96 --- /dev/null +++ b/test/issues/731/fork07.txt @@ -0,0 +1,4 @@ +fork07 0 TINFO : Forking 100 children +fork07 0 TINFO : Forked all 100 children, now collecting +fork07 0 TINFO : Collected all 100 children +fork07 1 TPASS : 100/100 children read correctly from an inheritted fd diff --git a/test/issues/731/fork08.txt b/test/issues/731/fork08.txt new file mode 100644 index 00000000..6fe1dceb --- /dev/null +++ b/test/issues/731/fork08.txt @@ -0,0 +1,11 @@ +fork08 0 TINFO : parent forksval: 1 +fork08 0 TINFO : parent forksval: 2 +fork08 0 TINFO : second child got char: b +fork08 1 TPASS : Test passed in childnumber 2 +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 1 TPASS : parent test PASSED +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 2 TPASS : parent test PASSED +fork08 0 TINFO : exit status of wait expected 0 got 0 +fork08 3 TPASS : parent test PASSED +fork08 0 TINFO : Number of processes forked is 2 diff --git a/test/issues/731/g310a.c b/test/issues/731/g310a.c new file mode 100644 index 00000000..d4788e3a --- /dev/null +++ b/test/issues/731/g310a.c @@ -0,0 +1,55 @@ +/* + * g310a: If superuser try to fork() after seteuid(bin), ... + */ + +#include +#include +#include +#include + +int main(void) +{ + int error; + struct passwd *pwd; + pid_t pid; + int ws; + + if (geteuid()) { + printf("not a superuser\n"); + return 2; + } + + pwd = getpwnam("bin"); + if (!pwd) { + perror("getpwnam"); + return 1; + } + + error = seteuid(pwd->pw_uid); + if (error) { + perror("seteuid"); + return 1; + } + + pid = fork(); + if (pid == -1) { + perror("fork"); + } + + if (!pid) { + return 0; + } + + pid = waitpid(pid, &ws, 0); + if (pid == -1) { + perror("waitpid"); + return 1; + } + if (ws) { + printf("ws: %#x\n", ws); + return 1; + } + + printf("done.\n"); + return 0; +} diff --git a/test/issues/731/g310a.txt b/test/issues/731/g310a.txt new file mode 100644 index 00000000..91b35a9b --- /dev/null +++ b/test/issues/731/g310a.txt @@ -0,0 +1,5 @@ +Error: Failed to open /dev/mcos0. +ERROR: opening /dev/mcos0 +fork(): error with child process after fork +fork: Permission denied +waitpid: No child processes