1f6603c60Sopenharmony_ci/* 2f6603c60Sopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 3f6603c60Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4f6603c60Sopenharmony_ci * you may not use this file except in compliance with the License. 5f6603c60Sopenharmony_ci * You may obtain a copy of the License at 6f6603c60Sopenharmony_ci * 7f6603c60Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8f6603c60Sopenharmony_ci * 9f6603c60Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10f6603c60Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11f6603c60Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f6603c60Sopenharmony_ci * See the License for the specific language governing permissions and 13f6603c60Sopenharmony_ci * limitations under the License. 14f6603c60Sopenharmony_ci */ 15f6603c60Sopenharmony_ci 16f6603c60Sopenharmony_ci#include <errno.h> 17f6603c60Sopenharmony_ci#include <gtest/gtest.h> 18f6603c60Sopenharmony_ci#include "log.h" 19f6603c60Sopenharmony_ci#include "utils.h" 20f6603c60Sopenharmony_ci#include "libfs.h" 21f6603c60Sopenharmony_ci#include "KernelConstants.h" 22f6603c60Sopenharmony_ci 23f6603c60Sopenharmony_ciusing namespace testing::ext; 24f6603c60Sopenharmony_ci 25f6603c60Sopenharmony_ci#define RES_DIR_DYLOAD RES_DIR_KERNEL "dyload/" 26f6603c60Sopenharmony_ci 27f6603c60Sopenharmony_ciclass ExecveTest : public testing::Test { 28f6603c60Sopenharmony_ci}; 29f6603c60Sopenharmony_ci 30f6603c60Sopenharmony_ci/** 31f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_DL_ELF_0100 32f6603c60Sopenharmony_ci * @tc.name execve fixed address elf, non-pie elf 33f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 34f6603c60Sopenharmony_ci */ 35f6603c60Sopenharmony_ciHWTEST_F(ExecveTest, testExecFixedAddressELF, Function | MediumTest | Level1) 36f6603c60Sopenharmony_ci{ 37f6603c60Sopenharmony_ci char* testELF = RES_DIR_DYLOAD "hello_nopie"; 38f6603c60Sopenharmony_ci int rt = RunElf(testELF, NULL, NULL); 39f6603c60Sopenharmony_ci EXPECT_EQ(rt, 0) << "fixed address elf test failed! exitcode=" << rt; 40f6603c60Sopenharmony_ci} 41f6603c60Sopenharmony_ci 42f6603c60Sopenharmony_ci/** 43f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_DL_ELF_0200 44f6603c60Sopenharmony_ci * @tc.name execve static link elf 45f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 46f6603c60Sopenharmony_ci */ 47f6603c60Sopenharmony_ciHWTEST_F(ExecveTest, testExecStaticELF, Function | MediumTest | Level1) 48f6603c60Sopenharmony_ci{ 49f6603c60Sopenharmony_ci char* testELF = RES_DIR_DYLOAD "hello_static"; 50f6603c60Sopenharmony_ci int rt = RunElf(testELF, NULL, NULL); 51f6603c60Sopenharmony_ci EXPECT_EQ(rt, 0) << "static link elf test failed! exitcode=" << rt; 52f6603c60Sopenharmony_ci} 53f6603c60Sopenharmony_ci 54f6603c60Sopenharmony_ci 55f6603c60Sopenharmony_ci/** 56f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_DL_Execve_fname_0100 57f6603c60Sopenharmony_ci * @tc.name execve parameter1 fname test 58f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 59f6603c60Sopenharmony_ci */ 60f6603c60Sopenharmony_ciHWTEST_F(ExecveTest, testParaFilename, Function | MediumTest | Level1) 61f6603c60Sopenharmony_ci{ 62f6603c60Sopenharmony_ci char* resELF = RES_DIR_DYLOAD "executor1"; 63f6603c60Sopenharmony_ci char* testELF1 = resELF; 64f6603c60Sopenharmony_ci char* testELF2 = "/storage/executor2"; 65f6603c60Sopenharmony_ci char* testELF3 = "/storage/data/executor3"; 66f6603c60Sopenharmony_ci 67f6603c60Sopenharmony_ci // test SetUp 68f6603c60Sopenharmony_ci ASSERT_EQ(CopyFile(testELF1, testELF2), 0); 69f6603c60Sopenharmony_ci EXPECT_EQ(CopyFile(testELF1, testELF3), 0); 70f6603c60Sopenharmony_ci int rt = chmod(testELF2, 0777); 71f6603c60Sopenharmony_ci if (rt) { 72f6603c60Sopenharmony_ci // chmod may fail if DAC is not enabled, so this failure is not 'record' 73f6603c60Sopenharmony_ci LOG("chmod '%s' failed: rt=%d, errno=%d", testELF2, rt, errno); 74f6603c60Sopenharmony_ci } 75f6603c60Sopenharmony_ci rt = chmod(testELF3, 0777); 76f6603c60Sopenharmony_ci if (rt) { 77f6603c60Sopenharmony_ci LOG("chmod '%s' failed: rt=%d, errno=%d", testELF3, rt, errno); 78f6603c60Sopenharmony_ci } 79f6603c60Sopenharmony_ci char* curPath = GetCurrentPath(); 80f6603c60Sopenharmony_ci EXPECT_EQ(chdir("/storage/data"), 0); 81f6603c60Sopenharmony_ci LOG("SetUp ok"); 82f6603c60Sopenharmony_ci 83f6603c60Sopenharmony_ci // test 84f6603c60Sopenharmony_ci rt = RunElf(testELF1, NULL, NULL); 85f6603c60Sopenharmony_ci EXPECT_EQ(rt, 0) << "execve absolute path elf failed! exitcode=" << rt; 86f6603c60Sopenharmony_ci 87f6603c60Sopenharmony_ci rt = RunElf("./executor3", NULL, NULL); 88f6603c60Sopenharmony_ci EXPECT_EQ(rt, 0) << "execve relative-path1 elf failed! exitcode=" << rt; 89f6603c60Sopenharmony_ci rt = RunElf("../data/executor3", NULL, NULL); 90f6603c60Sopenharmony_ci EXPECT_EQ(rt, 0) << "execve relative-path2 elf failed! exitcode=" << rt; 91f6603c60Sopenharmony_ci 92f6603c60Sopenharmony_ci rt = RunElf("../executor2", NULL, NULL); 93f6603c60Sopenharmony_ci EXPECT_EQ(rt, 0) << "execve upper-path-file failed! exitcode=" << rt; 94f6603c60Sopenharmony_ci 95f6603c60Sopenharmony_ci rt = StartExecveError("./executorNoExist", NULL, NULL); 96f6603c60Sopenharmony_ci EXPECT_EQ(rt, ENOENT) << "execve non-exist-elf errno failed! errno=" << rt; 97f6603c60Sopenharmony_ci 98f6603c60Sopenharmony_ci // test TearDown 99f6603c60Sopenharmony_ci EXPECT_EQ(RemoveFile(testELF2), 0); 100f6603c60Sopenharmony_ci EXPECT_EQ(RemoveFile(testELF3), 0); 101f6603c60Sopenharmony_ci ASSERT_EQ(chdir(curPath), 0); 102f6603c60Sopenharmony_ci LOG("TearDown ok "); 103f6603c60Sopenharmony_ci} 104f6603c60Sopenharmony_ci 105f6603c60Sopenharmony_ci/** 106f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_DL_Execve_argv_0100 107f6603c60Sopenharmony_ci * @tc.name execve parameter2 argv test 108f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 109f6603c60Sopenharmony_ci */ 110f6603c60Sopenharmony_ciHWTEST_F(ExecveTest, testParaArgv, Function | MediumTest | Level1) 111f6603c60Sopenharmony_ci{ 112f6603c60Sopenharmony_ci int rt; 113f6603c60Sopenharmony_ci char* resELF = RES_DIR_DYLOAD "executor2"; 114f6603c60Sopenharmony_ci 115f6603c60Sopenharmony_ci char *arg[] = {"1", "!@#$%^&*()_+", NULL}; 116f6603c60Sopenharmony_ci rt = RunElf(resELF, arg, NULL); 117f6603c60Sopenharmony_ci EXPECT_FALSE(rt) << "execve elf with normal argv parameter failed !"; 118f6603c60Sopenharmony_ci sleep(1); 119f6603c60Sopenharmony_ci 120f6603c60Sopenharmony_ci char *arg2[] = {"2", "aaaa", "bbbb", NULL}; 121f6603c60Sopenharmony_ci rt = RunElf(resELF, arg2, NULL); 122f6603c60Sopenharmony_ci EXPECT_FALSE(rt) << "execve elf with normal argv parameter failed !"; 123f6603c60Sopenharmony_ci sleep(1); 124f6603c60Sopenharmony_ci 125f6603c60Sopenharmony_ci char *arg3[] = {"3", "-f", "/home/result/log.txt", "-d", "!@#$%^&*()_+", NULL}; 126f6603c60Sopenharmony_ci rt = RunElf(resELF, arg3, NULL); 127f6603c60Sopenharmony_ci EXPECT_FALSE(rt) << "execve elf with normal argv parameter failed !"; 128f6603c60Sopenharmony_ci} 129f6603c60Sopenharmony_ci 130f6603c60Sopenharmony_ci/** 131f6603c60Sopenharmony_ci * @tc.number SUB_KERNEL_DL_Execve_envp_0100 132f6603c60Sopenharmony_ci * @tc.name execve parameter3 envp test 133f6603c60Sopenharmony_ci * @tc.desc [C- SOFTWARE -0200] 134f6603c60Sopenharmony_ci */ 135f6603c60Sopenharmony_ciHWTEST_F(ExecveTest, testParaEnvp, Function | MediumTest | Level1) 136f6603c60Sopenharmony_ci{ 137f6603c60Sopenharmony_ci int rt; 138f6603c60Sopenharmony_ci char* resELF = RES_DIR_DYLOAD "executor2"; 139f6603c60Sopenharmony_ci 140f6603c60Sopenharmony_ci char *arg[] = {"1", "!@#$%^&*()_+", NULL}; 141f6603c60Sopenharmony_ci rt = RunElf(resELF, NULL, arg); 142f6603c60Sopenharmony_ci EXPECT_FALSE(rt) << "execve elf with normal envp parameter failed !"; 143f6603c60Sopenharmony_ci sleep(1); 144f6603c60Sopenharmony_ci 145f6603c60Sopenharmony_ci char *arg2[]={"2", "aaaa", "bbbb", NULL}; 146f6603c60Sopenharmony_ci rt = RunElf(resELF, NULL, arg2); 147f6603c60Sopenharmony_ci EXPECT_FALSE(rt) << "execve elf with normal envp parameter failed !"; 148f6603c60Sopenharmony_ci sleep(1); 149f6603c60Sopenharmony_ci 150f6603c60Sopenharmony_ci char *arg3[] = {"3", "-f", "/home/result/log.txt", "-d", "!@#$%^&*()_+", NULL}; 151f6603c60Sopenharmony_ci rt = RunElf(resELF, NULL, arg3); 152f6603c60Sopenharmony_ci EXPECT_FALSE(rt) << "execve elf with normal envp parameter failed !"; 153f6603c60Sopenharmony_ci}