19762338dSopenharmony_ci/* 29762338dSopenharmony_ci * Copyright (C) 2024 HiHope Open Source Organization. 39762338dSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 49762338dSopenharmony_ci * you may not use this file except in compliance with the License. 59762338dSopenharmony_ci * You may obtain a copy of the License at 69762338dSopenharmony_ci * 79762338dSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 89762338dSopenharmony_ci * 99762338dSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 109762338dSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 119762338dSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129762338dSopenharmony_ci * See the License for the specific language governing permissions and 139762338dSopenharmony_ci * limitations under the License. 149762338dSopenharmony_ci */ 159762338dSopenharmony_ci 169762338dSopenharmony_ci#include <cerrno> 179762338dSopenharmony_ci#include <cstdio> 189762338dSopenharmony_ci#include <cstdlib> 199762338dSopenharmony_ci#include <csignal> 209762338dSopenharmony_ci#include <string> 219762338dSopenharmony_ci#include <vector> 229762338dSopenharmony_ci#include <fcntl.h> 239762338dSopenharmony_ci#include <malloc.h> 249762338dSopenharmony_ci#include <unistd.h> 259762338dSopenharmony_ci#include <arpa/inet.h> 269762338dSopenharmony_ci#include <gtest/gtest.h> 279762338dSopenharmony_ci#include <netinet/in.h> 289762338dSopenharmony_ci#include <sys/mman.h> 299762338dSopenharmony_ci#include <sys/stat.h> 309762338dSopenharmony_ci#include <sys/types.h> 319762338dSopenharmony_ci#include <sys/socket.h> 329762338dSopenharmony_ci#include "securec.h" 339762338dSopenharmony_ci 349762338dSopenharmony_ciusing namespace testing::ext; 359762338dSopenharmony_ci 369762338dSopenharmony_ciclass HatsMprotectTest : public testing::Test { 379762338dSopenharmony_cipublic: 389762338dSopenharmony_ci static void SetUpTestCase(); 399762338dSopenharmony_ci static void TearDownTestCase(); 409762338dSopenharmony_ci void SetUp(); 419762338dSopenharmony_ci void TearDown(); 429762338dSopenharmony_ciprivate: 439762338dSopenharmony_ci}; 449762338dSopenharmony_civoid HatsMprotectTest::SetUp() 459762338dSopenharmony_ci{ 469762338dSopenharmony_ci} 479762338dSopenharmony_ci 489762338dSopenharmony_civoid HatsMprotectTest::TearDown() 499762338dSopenharmony_ci{ 509762338dSopenharmony_ci} 519762338dSopenharmony_ci 529762338dSopenharmony_civoid HatsMprotectTest::SetUpTestCase() 539762338dSopenharmony_ci{ 549762338dSopenharmony_ci} 559762338dSopenharmony_ci 569762338dSopenharmony_civoid HatsMprotectTest::TearDownTestCase() 579762338dSopenharmony_ci{ 589762338dSopenharmony_ci} 599762338dSopenharmony_ci 609762338dSopenharmony_ci/* 619762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_MPROTECT_0100 629762338dSopenharmony_ci * @tc.name : MprotectWriteSuccess_0001 639762338dSopenharmony_ci * @tc.desc : mprotect changes the access protections to PROT_WRITE successfully. 649762338dSopenharmony_ci * @tc.size : MediumTest 659762338dSopenharmony_ci * @tc.type : Function 669762338dSopenharmony_ci * @tc.level : Level 1 679762338dSopenharmony_ci */ 689762338dSopenharmony_ciHWTEST_F(HatsMprotectTest, MprotectWriteSuccess_0001, Function | MediumTest | Level1) 699762338dSopenharmony_ci{ 709762338dSopenharmony_ci int ret; 719762338dSopenharmony_ci int pagesize; 729762338dSopenharmony_ci struct sigaction sa; 739762338dSopenharmony_ci 749762338dSopenharmony_ci sa.sa_flags = SA_SIGINFO; 759762338dSopenharmony_ci sigemptyset(&sa.sa_mask); 769762338dSopenharmony_ci EXPECT_NE(sigaction(SIGSEGV, &sa, nullptr), -1); 779762338dSopenharmony_ci 789762338dSopenharmony_ci pagesize = sysconf(_SC_PAGE_SIZE); 799762338dSopenharmony_ci EXPECT_NE(pagesize, -1); 809762338dSopenharmony_ci 819762338dSopenharmony_ci // Allocate a buffer aligned on a page boundary; initial protection is PROT_WRITE. 829762338dSopenharmony_ci void *buffer = memalign(pagesize, 4 * pagesize); 839762338dSopenharmony_ci EXPECT_NE(buffer, nullptr); 849762338dSopenharmony_ci 859762338dSopenharmony_ci ret = mprotect(buffer, pagesize, PROT_WRITE); 869762338dSopenharmony_ci EXPECT_EQ(ret, 0); 879762338dSopenharmony_ci} 889762338dSopenharmony_ci 899762338dSopenharmony_ci/* 909762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_MPROTECT_0200 919762338dSopenharmony_ci * @tc.name : MprotectExeSuccess_0002 929762338dSopenharmony_ci * @tc.desc : mprotect changes the access protections to PROT_EXEC successfully. 939762338dSopenharmony_ci * @tc.size : MediumTest 949762338dSopenharmony_ci * @tc.type : Function 959762338dSopenharmony_ci * @tc.level : Level 1 969762338dSopenharmony_ci */ 979762338dSopenharmony_ciHWTEST_F(HatsMprotectTest, MprotectExeSuccess_0002, Function | MediumTest | Level1) 989762338dSopenharmony_ci{ 999762338dSopenharmony_ci int ret; 1009762338dSopenharmony_ci int pagesize; 1019762338dSopenharmony_ci struct sigaction sa; 1029762338dSopenharmony_ci 1039762338dSopenharmony_ci sa.sa_flags = SA_SIGINFO; 1049762338dSopenharmony_ci sigemptyset(&sa.sa_mask); 1059762338dSopenharmony_ci EXPECT_NE(sigaction(SIGSEGV, &sa, nullptr), -1); 1069762338dSopenharmony_ci 1079762338dSopenharmony_ci pagesize = sysconf(_SC_PAGE_SIZE); 1089762338dSopenharmony_ci EXPECT_NE(pagesize, -1); 1099762338dSopenharmony_ci 1109762338dSopenharmony_ci // Allocate a buffer aligned on a page boundary; initial protection is PROT_EXEC. 1119762338dSopenharmony_ci void *buf = memalign(pagesize, 4 * pagesize); 1129762338dSopenharmony_ci EXPECT_NE(buf, nullptr); 1139762338dSopenharmony_ci 1149762338dSopenharmony_ci ret = mprotect(buf, pagesize, PROT_EXEC); 1159762338dSopenharmony_ci EXPECT_EQ(ret, 0); 1169762338dSopenharmony_ci} 1179762338dSopenharmony_ci 1189762338dSopenharmony_ci/* 1199762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_MPROTECT_0300 1209762338dSopenharmony_ci * @tc.name : MprotectAddrInvalid_0003 1219762338dSopenharmony_ci * @tc.desc : mprotect changes the access protections to PROT_READ failed for invalid address,error code is ENOMEM. 1229762338dSopenharmony_ci * @tc.size : MediumTest 1239762338dSopenharmony_ci * @tc.type : Function 1249762338dSopenharmony_ci * @tc.level : Level 2 1259762338dSopenharmony_ci */ 1269762338dSopenharmony_ciHWTEST_F(HatsMprotectTest, MprotectAddrInvalid_0003, Function | MediumTest | Level2) 1279762338dSopenharmony_ci{ 1289762338dSopenharmony_ci int ret; 1299762338dSopenharmony_ci int pagesize; 1309762338dSopenharmony_ci struct sigaction sa; 1319762338dSopenharmony_ci 1329762338dSopenharmony_ci sa.sa_flags = SA_SIGINFO; 1339762338dSopenharmony_ci sigemptyset(&sa.sa_mask); 1349762338dSopenharmony_ci EXPECT_NE(sigaction(SIGSEGV, &sa, nullptr), -1); 1359762338dSopenharmony_ci 1369762338dSopenharmony_ci pagesize = sysconf(_SC_PAGE_SIZE); 1379762338dSopenharmony_ci EXPECT_NE(pagesize, -1); 1389762338dSopenharmony_ci 1399762338dSopenharmony_ci void *buf = nullptr; 1409762338dSopenharmony_ci errno = 0; 1419762338dSopenharmony_ci ret = mprotect(buf, pagesize, PROT_READ); 1429762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1439762338dSopenharmony_ci EXPECT_EQ(errno, ENOMEM); 1449762338dSopenharmony_ci} 1459762338dSopenharmony_ci 1469762338dSopenharmony_ci/* 1479762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_MPROTECT_0400 1489762338dSopenharmony_ci * @tc.name : MprotectFlagInvalid_0004 1499762338dSopenharmony_ci * @tc.desc : mprotect changes the access protections to PROT_READ failed for flag invalid, error code is EINVAL. 1509762338dSopenharmony_ci * @tc.size : MediumTest 1519762338dSopenharmony_ci * @tc.type : Function 1529762338dSopenharmony_ci * @tc.level : Level 2 1539762338dSopenharmony_ci */ 1549762338dSopenharmony_ciHWTEST_F(HatsMprotectTest, MprotectFlagInvalid_0004, Function | MediumTest | Level2) 1559762338dSopenharmony_ci{ 1569762338dSopenharmony_ci int ret; 1579762338dSopenharmony_ci int pagesize; 1589762338dSopenharmony_ci struct sigaction sa; 1599762338dSopenharmony_ci 1609762338dSopenharmony_ci sa.sa_flags = SA_SIGINFO; 1619762338dSopenharmony_ci sigemptyset(&sa.sa_mask); 1629762338dSopenharmony_ci EXPECT_NE(sigaction(SIGSEGV, &sa, nullptr), -1); 1639762338dSopenharmony_ci 1649762338dSopenharmony_ci pagesize = sysconf(_SC_PAGE_SIZE); 1659762338dSopenharmony_ci EXPECT_NE(pagesize, -1); 1669762338dSopenharmony_ci 1679762338dSopenharmony_ci // Allocate a buffer aligned on a page boundary; initial protection is invalid value of 0xFF. 1689762338dSopenharmony_ci void *buf = memalign(pagesize, 4 * pagesize); 1699762338dSopenharmony_ci EXPECT_NE(buf, nullptr); 1709762338dSopenharmony_ci 1719762338dSopenharmony_ci errno = 0; 1729762338dSopenharmony_ci ret = mprotect(buf, pagesize, 0xFF); 1739762338dSopenharmony_ci 1749762338dSopenharmony_ci EXPECT_EQ(ret, -1); 1759762338dSopenharmony_ci EXPECT_EQ(errno, EINVAL); 1769762338dSopenharmony_ci} 1779762338dSopenharmony_ci 1789762338dSopenharmony_ci/* 1799762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_MPROTECT_0500 1809762338dSopenharmony_ci * @tc.name : MprotectUpDownInvalid_0005 1819762338dSopenharmony_ci * @tc.desc : When PROT_GROWSUP and PROT_GROWSDOWN specified change access protections failed, 1829762338dSopenharmony_ci * @tc.size : MediumTest 1839762338dSopenharmony_ci * @tc.type : Function 1849762338dSopenharmony_ci * @tc.level : Level 2 1859762338dSopenharmony_ci */ 1869762338dSopenharmony_ciHWTEST_F(HatsMprotectTest, MprotectUpDownInvalid_0005, Function | MediumTest | Level2) 1879762338dSopenharmony_ci{ 1889762338dSopenharmony_ci int ret; 1899762338dSopenharmony_ci int pagesize; 1909762338dSopenharmony_ci struct sigaction sa; 1919762338dSopenharmony_ci 1929762338dSopenharmony_ci sa.sa_flags = SA_SIGINFO; 1939762338dSopenharmony_ci sigemptyset(&sa.sa_mask); 1949762338dSopenharmony_ci EXPECT_NE(sigaction(SIGSEGV, &sa, nullptr), -1); 1959762338dSopenharmony_ci 1969762338dSopenharmony_ci pagesize = sysconf(_SC_PAGE_SIZE); 1979762338dSopenharmony_ci EXPECT_NE(pagesize, -1); 1989762338dSopenharmony_ci 1999762338dSopenharmony_ci // Allocate a buffer aligned on a page boundary; initial protection are PROT_GROWSUP and PROT_GROWSDOWN. 2009762338dSopenharmony_ci void *buf = memalign(pagesize, 4 * pagesize); 2019762338dSopenharmony_ci EXPECT_NE(buf, nullptr); 2029762338dSopenharmony_ci 2039762338dSopenharmony_ci errno = 0; 2049762338dSopenharmony_ci ret = mprotect(buf, pagesize, PROT_GROWSUP | PROT_GROWSDOWN); 2059762338dSopenharmony_ci 2069762338dSopenharmony_ci EXPECT_EQ(ret, -1); 2079762338dSopenharmony_ci EXPECT_EQ(errno, EINVAL); 2089762338dSopenharmony_ci} 2099762338dSopenharmony_ci 2109762338dSopenharmony_ci/* 2119762338dSopenharmony_ci * @tc.number : SUB_KERNEL_SYSCALL_MPROTECT_0600 2129762338dSopenharmony_ci * @tc.name : MprotectPROT_NONETestSuccess_0006 2139762338dSopenharmony_ci * @tc.desc : mprotect PROT_NONE flag test successfully. 2149762338dSopenharmony_ci * @tc.size : MediumTest 2159762338dSopenharmony_ci * @tc.type : Function 2169762338dSopenharmony_ci * @tc.level : Level 1 2179762338dSopenharmony_ci */ 2189762338dSopenharmony_ciHWTEST_F(HatsMprotectTest, MprotectPROT_NONETestSuccess_0006, Function | MediumTest | Level1) 2199762338dSopenharmony_ci{ 2209762338dSopenharmony_ci int ret; 2219762338dSopenharmony_ci int pagesize; 2229762338dSopenharmony_ci struct sigaction sa; 2239762338dSopenharmony_ci 2249762338dSopenharmony_ci sa.sa_flags = SA_SIGINFO; 2259762338dSopenharmony_ci sigemptyset(&sa.sa_mask); 2269762338dSopenharmony_ci EXPECT_NE(sigaction(SIGSEGV, &sa, nullptr), -1); 2279762338dSopenharmony_ci 2289762338dSopenharmony_ci pagesize = sysconf(_SC_PAGE_SIZE); 2299762338dSopenharmony_ci EXPECT_NE(pagesize, -1); 2309762338dSopenharmony_ci 2319762338dSopenharmony_ci void *buffer = memalign(pagesize, 4 * pagesize); 2329762338dSopenharmony_ci EXPECT_NE(buffer, nullptr); 2339762338dSopenharmony_ci 2349762338dSopenharmony_ci ret = mprotect(buffer, pagesize, PROT_NONE); 2359762338dSopenharmony_ci EXPECT_EQ(ret, 0); 2369762338dSopenharmony_ci} 237