exec: Allocate necessary number of pages to argenv area

Change-Id: I298a0de2f4e34ed774e2db7d90167dbe0d35586e
Refs: #1174
This commit is contained in:
Ken Sato
2019-07-04 11:12:29 +09:00
committed by Masamichi Takagi
parent e58e1c6e33
commit 3e267e24cb
5 changed files with 155 additions and 7 deletions

View File

@ -80,6 +80,7 @@ int prepare_process_ranges_args_envs(struct thread *thread,
int i, n, argc, envc, args_envs_npages = 0;
char **env;
int range_npages;
int argenv_page_count = 0;
void *up_v;
unsigned long addr;
unsigned long flags;
@ -256,10 +257,24 @@ int prepare_process_ranges_args_envs(struct thread *thread,
/* Map, copy and update args and envs */
flags = VR_PROT_READ | VR_PROT_WRITE | VR_PRIVATE;
flags |= VRFLAG_PROT_TO_MAXPROT(flags);
addr = vm->region.map_start - PAGE_SIZE * SCD_RESERVED_COUNT;
e = addr + PAGE_SIZE * ARGENV_PAGE_COUNT;
if (!args) {
map_size = ((uintptr_t)p->args & (PAGE_SIZE - 1)) + p->args_len;
argenv_page_count += (map_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
}
else {
argenv_page_count += (args_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
}
if (!envs) {
map_size = ((uintptr_t)p->envs & (PAGE_SIZE - 1)) + p->envs_len;
argenv_page_count += (map_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
}
else {
argenv_page_count = (envs_len + PAGE_SIZE - 1) >> PAGE_SHIFT;
}
addr = vm->region.map_start - PAGE_SIZE * argenv_page_count;
e = addr + PAGE_SIZE * argenv_page_count;
if((args_envs = ihk_mc_alloc_pages_user(ARGENV_PAGE_COUNT,
if ((args_envs = ihk_mc_alloc_pages_user(argenv_page_count,
IHK_MC_AP_NOWAIT, -1)) == NULL){
kprintf("ERROR: allocating pages for args/envs\n");
goto err;
@ -267,10 +282,10 @@ int prepare_process_ranges_args_envs(struct thread *thread,
args_envs_p = virt_to_phys(args_envs);
dkprintf("%s: args_envs: %d pages\n",
__FUNCTION__, ARGENV_PAGE_COUNT);
__func__, argenv_page_count);
if(add_process_memory_range(vm, addr, e, args_envs_p,
flags, NULL, 0, PAGE_SHIFT, NULL) != 0){
ihk_mc_free_pages_user(args_envs, ARGENV_PAGE_COUNT);
ihk_mc_free_pages_user(args_envs, argenv_page_count);
kprintf("ERROR: adding memory range for args/envs\n");
goto err;
}

View File

@ -26,8 +26,6 @@
#define REQUEST_PAGE_COUNT 16
#define RESPONSE_PAGE_COUNT 16
#define DOORBELL_PAGE_COUNT 1
#define ARGENV_PAGE_COUNT 8
#define SCD_RESERVED_COUNT ARGENV_PAGE_COUNT
#define SCD_MSG_PREPARE_PROCESS 0x1
#define SCD_MSG_PREPARE_PROCESS_ACKED 0x2

70
test/issues/1174/C1174.sh Normal file
View File

@ -0,0 +1,70 @@
#!/bin/sh
USELTP=1
USEOSTEST=0
. ../../common.sh
issue=1174
tid=01
echo "*** C$issueT$tid start *******************************"
echo "execute: mcexec ls -ld /proc/*/* &> /dev/null"
${MCEXEC} ls -ld /proc/*/* &> /dev/null
if [ $? -ne 0 ]; then
echo "*** C$issue$tid: PASSED"
else
echo "*** C$issue$tid: FAILED"
fi
echo ""
tid=02
echo "*** C$issueT$tid start *******************************"
sudo PATH=${LTPBIN}:${PATH} ${MCEXEC} ${LTPBIN}/execve01 \
2>&1 | tee ./C${issue}T${tid}.txt
ok=`grep TPASS C${issue}T${tid}.txt | wc -l`
ng=`grep TFAIL C${issue}T${tid}.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** C${issue}T$tid: PASSED (ok:$ok)"
else
echo "*** C${issue}T$tid: FAILED (ok:$ok, ng:$ng)"
fi
echo ""
tid=03
echo "*** C$issueT$tid start *******************************"
sudo PATH=${LTPBIN}:${PATH} ${MCEXEC} ${LTPBIN}/execve02 \
2>&1 | tee ./C${issue}T${tid}.txt
ok=`grep TPASS C${issue}T${tid}.txt | wc -l`
ng=`grep TFAIL C${issue}T${tid}.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** C${issue}T$tid: PASSED (ok:$ok)"
else
echo "*** C${issue}T$tid: FAILED (ok:$ok, ng:$ng)"
fi
echo ""
tid=04
echo "*** C$issueT$tid start *******************************"
sudo PATH=${LTPBIN}:${PATH} ${MCEXEC} ${LTPBIN}/execve03 \
2>&1 | tee ./C${issue}T${tid}.txt
ok=`grep TPASS C${issue}T${tid}.txt | wc -l`
ng=`grep TFAIL C${issue}T${tid}.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** C${issue}T$tid: PASSED (ok:$ok)"
else
echo "*** C${issue}T$tid: FAILED (ok:$ok, ng:$ng)"
fi
echo ""
tid=05
echo "*** C$issueT$tid start *******************************"
sudo PATH=${LTPBIN}:${PATH} ${MCEXEC} ${LTPBIN}/execve05 \
20 ${LTPBIN}/execve05 ${LTPBIN}/execve05 4 2>&1 | tee ./C${issue}T${tid}.txt
ok=`grep TPASS C${issue}T${tid}.txt | wc -l`
ng=`grep TFAIL C${issue}T${tid}.txt | wc -l`
if [ $ng = 0 ]; then
echo "*** C${issue}T$tid: PASSED (ok:$ok)"
else
echo "*** C${issue}T$tid: FAILED (ok:$ok, ng:$ng)"
fi
echo ""

32
test/issues/1174/README Normal file
View File

@ -0,0 +1,32 @@
【Issue#1174 動作確認】
□ テスト内容
1. Issueで報告された再現プログラムでの確認
C1174T01: mcexec ls -ld /proc/*/* を実行する
mcexecが無応答にならず、正常に終了することを確認
2. 既存のexecve機能に影響がないことをLTPを用いて確認
C1174T02: ltp-execve01
子プロセスがexecveを実行し、正常に終了することを確認 (TPASS 1件)
C1174T03: ltp-execve02
rootのみに実行権限が付与された実行ファイルを、
一般ユーザがexecveした場合に失敗することを確認 (TPASS 1件)
C1174T04: ltp-execve03
下記の不正な引数でexecveを実行した場合、返り値と設定されるerrnoが
正しいことを確認 (TPASS 6件)
C1174T05: ltp-execve05
execveの標準的な動作を確認 (TPASS 8件)
□ 実行手順
$ make test
McKernelのインストール先や、OSTEST, LTPの配置場所は、
$HOME/.mck_test_config を参照している
.mck_test_config は、McKernelをビルドした際に生成されるmck_test_config.sample ファイルを
$HOMEにコピーし、適宜編集する
□ 実行結果
result.log 参照。
すべての項目をPASSしていることを確認。

View File

@ -0,0 +1,33 @@
*** C01 start *******************************
execute: mcexec ls -ld /proc/*/* &> /dev/null
*** C117401: PASSED
*** C02 start *******************************
execl01_child 1 TPASS : execve01_child executed
execve01 0 TINFO : Child process returned TPASS
*** C1174T02: PASSED (ok:2)
*** C03 start *******************************
execve02 1 TPASS : execve() failed expectedly: TEST_ERRNO=EACCES(13): Permission denied
execve02 0 TINFO : Child process returned TPASS
*** C1174T03: PASSED (ok:2)
*** C04 start *******************************
execve03 1 TPASS : execve failed as expected: TEST_ERRNO=ENAMETOOLONG(36): File name too long
execve03 2 TPASS : execve failed as expected: TEST_ERRNO=ENOENT(2): No such file or directory
execve03 3 TPASS : execve failed as expected: TEST_ERRNO=ENOTDIR(20): Not a directory
execve03 4 TPASS : execve failed as expected: TEST_ERRNO=EFAULT(14): Bad address
execve03 5 TPASS : execve failed as expected: TEST_ERRNO=EACCES(13): Permission denied
execve03 6 TPASS : execve failed as expected: TEST_ERRNO=ENOEXEC(8): Exec format error
*** C1174T04: PASSED (ok:6)
*** C05 start *******************************
execve05 1 TPASS : Test DONE, pid 2663, -- /home/satoken/ltp/testcases/bin/execve05 0 /home/satoken/ltp/testcases/bin/execve05 /home/satoken/ltp/testcases/bin/execve05
execve05 1 TPASS : Test DONE, pid 2694, -- /home/satoken/ltp/testcases/bin/execve05 0 /home/satoken/ltp/testcases/bin/execve05 /home/satoken/ltp/testcases/bin/execve05
execve05 1 TPASS : Test DONE, pid 2724, -- /home/satoken/ltp/testcases/bin/execve05 0 /home/satoken/ltp/testcases/bin/execve05 /home/satoken/ltp/testcases/bin/execve05
execve05 1 TPASS : Test DONE, pid 2754, -- /home/satoken/ltp/testcases/bin/execve05 0 /home/satoken/ltp/testcases/bin/execve05 /home/satoken/ltp/testcases/bin/execve05
execve05 1 TPASS : Test DONE, pid 2784, -- /home/satoken/ltp/testcases/bin/execve05 0 /home/satoken/ltp/testcases/bin/execve05 /home/satoken/ltp/testcases/bin/execve05
execve05 1 TPASS : Test DONE, pid 2814, -- /home/satoken/ltp/testcases/bin/execve05 0 /home/satoken/ltp/testcases/bin/execve05 /home/satoken/ltp/testcases/bin/execve05
execve05 1 TPASS : Test DONE, pid 2844, -- /home/satoken/ltp/testcases/bin/execve05 0 /home/satoken/ltp/testcases/bin/execve05 /home/satoken/ltp/testcases/bin/execve05
execve05 1 TPASS : Test DONE, pid 2874, -- /home/satoken/ltp/testcases/bin/execve05 0 /home/satoken/ltp/testcases/bin/execve05 /home/satoken/ltp/testcases/bin/execve05
*** C1174T05: PASSED (ok:8)