do_fork: Propagate error code returned by mcexec
Refs: #731 Change-Id: I7eb52c1c76103d65d108b18b7beaf8041b51cd03
This commit is contained in:
committed by
Dominique Martinet
parent
0758f6254e
commit
1cbe389879
@ -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
66
test/issues/731/C731.sh
Normal 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
46
test/issues/731/C731.txt
Normal 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
13
test/issues/731/Makefile
Normal 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
35
test/issues/731/README
Normal 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 となっていることを確認。
|
||||
2
test/issues/731/fork01.txt
Normal file
2
test/issues/731/fork01.txt
Normal file
@ -0,0 +1,2 @@
|
||||
fork01 1 TPASS : fork() returned 14513
|
||||
fork01 2 TPASS : child pid and fork() return agree: 14513
|
||||
4
test/issues/731/fork02.txt
Normal file
4
test/issues/731/fork02.txt
Normal 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
|
||||
2
test/issues/731/fork03.txt
Normal file
2
test/issues/731/fork03.txt
Normal file
@ -0,0 +1,2 @@
|
||||
fork03 0 TINFO : process id in parent of child from fork : 14669
|
||||
fork03 1 TPASS : test 1 PASSED
|
||||
3
test/issues/731/fork04.txt
Normal file
3
test/issues/731/fork04.txt
Normal 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
|
||||
4
test/issues/731/fork07.txt
Normal file
4
test/issues/731/fork07.txt
Normal 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
|
||||
11
test/issues/731/fork08.txt
Normal file
11
test/issues/731/fork08.txt
Normal 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
55
test/issues/731/g310a.c
Normal 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;
|
||||
}
|
||||
5
test/issues/731/g310a.txt
Normal file
5
test/issues/731/g310a.txt
Normal 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
|
||||
Reference in New Issue
Block a user