do_fork: Propagate error code returned by mcexec

Refs: #731
Change-Id: I7eb52c1c76103d65d108b18b7beaf8041b51cd03
This commit is contained in:
Tomoki Shirasawa
2018-06-18 16:44:26 +09:00
committed by Dominique Martinet
parent 0758f6254e
commit 1cbe389879
13 changed files with 247 additions and 1 deletions

View File

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

66
test/issues/731/C731.sh Normal file
View File

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

46
test/issues/731/C731.txt Normal file
View File

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

13
test/issues/731/Makefile Normal file
View File

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

35
test/issues/731/README Normal file
View File

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

View File

@ -0,0 +1,2 @@
fork01 1 TPASS : fork() returned 14513
fork01 2 TPASS : child pid and fork() return agree: 14513

View File

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

View File

@ -0,0 +1,2 @@
fork03 0 TINFO : process id in parent of child from fork : 14669
fork03 1 TPASS : test 1 PASSED

View File

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

View File

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

View File

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

55
test/issues/731/g310a.c Normal file
View File

@ -0,0 +1,55 @@
/*
* g310a: If superuser try to fork() after seteuid(bin), ...
*/
#include <pwd.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
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;
}

View File

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