diff --git a/kernel/host.c b/kernel/host.c index 61715f09..521b2fdf 100644 --- a/kernel/host.c +++ b/kernel/host.c @@ -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; } diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index bc8369d9..3fb94fe8 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -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 diff --git a/test/issues/1174/C1174.sh b/test/issues/1174/C1174.sh new file mode 100644 index 00000000..82efaf4e --- /dev/null +++ b/test/issues/1174/C1174.sh @@ -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 "" diff --git a/test/issues/1174/README b/test/issues/1174/README new file mode 100644 index 00000000..3b581bd8 --- /dev/null +++ b/test/issues/1174/README @@ -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していることを確認。 diff --git a/test/issues/1174/result.log b/test/issues/1174/result.log new file mode 100644 index 00000000..8453d785 --- /dev/null +++ b/test/issues/1174/result.log @@ -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)