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}