exec: Allocate necessary number of pages to argenv area
Change-Id: I298a0de2f4e34ed774e2db7d90167dbe0d35586e Refs: #1174
This commit is contained in:
committed by
Masamichi Takagi
parent
e58e1c6e33
commit
3e267e24cb
@ -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;
|
||||
}
|
||||
|
||||
@ -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
70
test/issues/1174/C1174.sh
Normal 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
32
test/issues/1174/README
Normal 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していることを確認。
|
||||
33
test/issues/1174/result.log
Normal file
33
test/issues/1174/result.log
Normal 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)
|
||||
Reference in New Issue
Block a user