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 buffer_underflow_handler() 23{ 24 find_and_check_file(GWP_ASAN_LOG_DIR, GWP_ASAN_LOG_TAG, "Buffer Underflow"); 25 clear_log(GWP_ASAN_LOG_DIR, GWP_ASAN_LOG_TAG); 26 cancel_gwp_asan_environment(true); 27 _exit(0); 28} 29 30static void install_sigv_handler() 31{ 32 struct sigaction sigv = { 33 .sa_handler = buffer_underflow_handler, 34 .sa_flags = 0, 35 }; 36 sigaction(SIGSEGV, &sigv, NULL); 37} 38 39void buffer_underflow_test() 40{ 41 config_gwp_asan_environment(true); 42 clear_log(GWP_ASAN_LOG_DIR, GWP_ASAN_LOG_TAG); 43 install_sigv_handler(); 44 45 char *ptr = (char *)malloc(sysconf(_SC_PAGE_SIZE)); 46 if (!ptr) { 47 t_error("malloc failed."); 48 return; 49 } 50 if (!libc_gwp_asan_ptr_is_mine(ptr)) { 51 t_error("FAIL enter gwp_asan malloc failed!\n"); 52 return; 53 } 54 char c = *(ptr - 1); 55 printf("c:%c", c); 56} 57 58/* 59 * 60 *|--guard area--|--malloc area--|--guard area--| 61 * ^ 62 */ 63int main() 64{ 65 pid_t pid = fork(); 66 if (pid < 0) { 67 t_error("FAIL fork failed."); 68 } else if (pid == 0) { // child process 69 buffer_underflow_test(); 70 } else { // parent process 71 int status; 72 if (waitpid(pid, &status, 0) != pid) { 73 t_error("gwp_asan_buffer_underflow_test waitpid failed."); 74 } 75 76 if (WIFEXITED(status) && WEXITSTATUS(status) != 0) { 77 t_error("gwp_asan_buffer_underflow_test failed."); 78 } 79 80 cancel_gwp_asan_environment(true); 81 } 82 83 return t_status; 84}