1/** 2 * Copyright (c) 2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#include <signal.h> 17#include <stdio.h> 18#include <sys/wait.h> 19#include "gwp_asan_test.h" 20#include "test.h" 21 22void invalid_free_right_handler() 23{ 24 find_and_check_file(GWP_ASAN_LOG_DIR, GWP_ASAN_LOG_TAG, "Invalid (Wild) Free"); 25 find_and_check_file(GWP_ASAN_LOG_DIR, GWP_ASAN_LOG_TAG, "1 byte to the right"); 26 clear_log(GWP_ASAN_LOG_DIR, GWP_ASAN_LOG_TAG); 27 cancel_gwp_asan_environment(true); 28 _exit(0); 29} 30 31static void install_sigv_handler() 32{ 33 struct sigaction sigv = { 34 .sa_handler = invalid_free_right_handler, 35 .sa_flags = 0, 36 }; 37 sigaction(SIGSEGV, &sigv, NULL); 38} 39 40void invalid_free_right_test() 41{ 42 config_gwp_asan_environment(true); 43 clear_log(GWP_ASAN_LOG_DIR, GWP_ASAN_LOG_TAG); 44 install_sigv_handler(); 45 46 char *ptr = (char *)malloc(1); 47 if (!ptr) { 48 t_error("malloc failed."); 49 return; 50 } 51 if (!libc_gwp_asan_ptr_is_mine(ptr)) { 52 t_error("Memory is not allocated by gwp_asan."); 53 return; 54 } 55 free(ptr + 1); 56} 57 58int main() 59{ 60 pid_t pid = fork(); 61 if (pid < 0) { 62 t_error("FAIL fork failed."); 63 } else if (pid == 0) { // child process 64 invalid_free_right_test(); 65 } else { // parent process 66 int status; 67 if (waitpid(pid, &status, 0) != pid) { 68 t_error("gwp_asan_invalid_free_right_test waitpid failed."); 69 } 70 71 if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { 72 t_error("gwp_asan_invalid_free_right_test failed."); 73 } 74 75 cancel_gwp_asan_environment(true); 76 } 77 78 return t_status; 79}