t_asan_off_by_one.sh revision 1.1
11.1Skamil# $NetBSD: t_asan_off_by_one.sh,v 1.1 2018/04/04 23:51:35 kamil Exp $ 21.1Skamil# 31.1Skamil# Copyright (c) 2018 The NetBSD Foundation, Inc. 41.1Skamil# All rights reserved. 51.1Skamil# 61.1Skamil# This code is derived from software contributed to The NetBSD Foundation 71.1Skamil# by Siddharth Muralee. 81.1Skamil# 91.1Skamil# Redistribution and use in source and binary forms, with or without 101.1Skamil# modification, are permitted provided that the following conditions 111.1Skamil# are met: 121.1Skamil# 1. Redistributions of source code must retain the above copyright 131.1Skamil# notice, this list of conditions and the following disclaimer. 141.1Skamil# 2. Redistributions in binary form must reproduce the above copyright 151.1Skamil# notice, this list of conditions and the following disclaimer in the 161.1Skamil# documentation and/or other materials provided with the distribution. 171.1Skamil# 181.1Skamil# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 191.1Skamil# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 201.1Skamil# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 211.1Skamil# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 221.1Skamil# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 231.1Skamil# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 241.1Skamil# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 251.1Skamil# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 261.1Skamil# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 271.1Skamil# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 281.1Skamil# POSSIBILITY OF SUCH DAMAGE. 291.1Skamil# 301.1Skamil 311.1SkamilSUPPORT='n' 321.1Skamiltest_target() { 331.1Skamil if uname -m | grep -q "amd64"; then 341.1Skamil SUPPORT='y' 351.1Skamil fi 361.1Skamil 371.1Skamil if uname -m | grep -q "i386"; then 381.1Skamil SUPPORT='y' 391.1Skamil fi 401.1Skamil} 411.1Skamil 421.1Skamilatf_test_case off_by_one 431.1Skamiloff_by_one_head() { 441.1Skamil atf_set "descr" "compile and run \"Off by one example\"" 451.1Skamil atf_set "require.progs" "cc paxctl" 461.1Skamil} 471.1Skamil 481.1Skamilatf_test_case off_by_one_profile 491.1Skamiloff_by_one_profile_head() { 501.1Skamil atf_set "descr" "compile and run \"Off by one example\" with profiling option" 511.1Skamil atf_set "require.progs" "cc paxctl" 521.1Skamil} 531.1Skamil 541.1Skamilatf_test_case off_by_one_pic 551.1Skamiloff_by_one_pic_head() { 561.1Skamil atf_set "descr" "compile and run PIC \"Off by one example\"" 571.1Skamil atf_set "require.progs" "cc paxctl" 581.1Skamil} 591.1Skamil 601.1Skamilatf_test_case off_by_one_pie 611.1Skamiloff_by_one_pie_head() { 621.1Skamil atf_set "descr" "compile and run position independent (PIE) \"Off by one example\"" 631.1Skamil atf_set "require.progs" "cc paxctl" 641.1Skamil} 651.1Skamil 661.1Skamilatf_test_case off_by_one32 671.1Skamiloff_by_one32_head() { 681.1Skamil atf_set "descr" "compile and run \"Off by one example\" for/in netbsd32 emulation" 691.1Skamil atf_set "require.progs" "cc paxctl file diff cat" 701.1Skamil} 711.1Skamil 721.1Skamilatf_test_case target_not_supported 731.1Skamiltarget_not_supported_head() 741.1Skamil{ 751.1Skamil atf_set "descr" "Test forced skip" 761.1Skamil} 771.1Skamil 781.1Skamiloff_by_one_body() { 791.1Skamil cat > test.c << EOF 801.1Skamil#include <stdio.h> 811.1Skamil#include <stdlib.h> 821.1Skamilvoid foo() { 831.1Skamil int arr[5]; 841.1Skamil for (int i = 0; i <= 5 ; i++) { 851.1Skamil arr[i] = 0; 861.1Skamil } 871.1Skamil} 881.1Skamilvoid main() {foo(); printf("CHECK\n"); exit(0);} 891.1SkamilEOF 901.1Skamil cc -fsanitize=address -o test test.c 911.1Skamil paxctl +a test 921.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"stack-buffer-overflow" ./test 931.1Skamil} 941.1Skamil 951.1Skamiloff_by_one_profile_body() { 961.1Skamil cat > test.c << EOF 971.1Skamil#include <stdio.h> 981.1Skamil#include <stdlib.h> 991.1Skamilvoid foo() { 1001.1Skamil int arr[5]; 1011.1Skamil for (int i = 0; i <= 5 ; i++) { 1021.1Skamil arr[i] = 0; 1031.1Skamil } 1041.1Skamil} 1051.1Skamilvoid main() {foo(); printf("CHECK\n"); exit(0);} 1061.1SkamilEOF 1071.1Skamil cc -fsanitize=address -o test -pg test.c 1081.1Skamil paxctl +a test 1091.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"stack-buffer-overflow" ./test 1101.1Skamil} 1111.1Skamil 1121.1Skamiloff_by_one_pic_body() { 1131.1Skamil cat > test.c << EOF 1141.1Skamil#include <stdio.h> 1151.1Skamil#include <stdlib.h> 1161.1Skamilvoid foo(); 1171.1Skamilvoid main() {foo(); printf("CHECK\n"); exit(0);} 1181.1SkamilEOF 1191.1Skamil cat > pic.c << EOF 1201.1Skamil#include <stdio.h> 1211.1Skamil#include <stdlib.h> 1221.1Skamilvoid foo() { 1231.1Skamil int arr[5]; 1241.1Skamil for (int i = 0; i <= 5 ; i++) { 1251.1Skamil arr[i] = 0; 1261.1Skamil } 1271.1Skamil} 1281.1SkamilEOF 1291.1Skamil cc -fPIC -fsanitize=address -shared -o libtest.so pic.c 1301.1Skamil cc -o test test.c -fsanitize=address -L. -ltest 1311.1Skamil 1321.1Skamil export LD_LIBRARY_PATH=. 1331.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"stack-buffer-overflow" ./test 1341.1Skamil} 1351.1Skamil 1361.1Skamiloff_by_one_pie_body() { 1371.1Skamil # check whether this arch supports -pice 1381.1Skamil if ! cc -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then 1391.1Skamil atf_set_skip "cc -pie not supported on this architecture" 1401.1Skamil fi 1411.1Skamil cat > test.c << EOF 1421.1Skamil#include <stdio.h> 1431.1Skamil#include <stdlib.h> 1441.1Skamilvoid foo() { 1451.1Skamil int arr[5]; 1461.1Skamil for (int i = 0; i <= 5 ; i++) { 1471.1Skamil arr[i] = 0; 1481.1Skamil } 1491.1Skamil} 1501.1Skamilvoid main() {foo(); printf("CHECK\n"); exit(0);} 1511.1SkamilEOF 1521.1Skamil cc -fsanitize=address -o test -fpie -pie test.c 1531.1Skamil paxctl +a test 1541.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"stack-buffer-overflow" ./test 1551.1Skamil} 1561.1Skamil 1571.1Skamiloff_by_one32_body() { 1581.1Skamil # check whether this arch is 64bit 1591.1Skamil if ! cc -dM -E - < /dev/null | fgrep -q _LP64; then 1601.1Skamil atf_skip "this is not a 64 bit architecture" 1611.1Skamil fi 1621.1Skamil if ! cc -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then 1631.1Skamil atf_skip "cc -m32 not supported on this architecture" 1641.1Skamil else 1651.1Skamil if fgrep -q _LP64 ./def32; then 1661.1Skamil atf_fail "cc -m32 does not generate netbsd32 binaries" 1671.1Skamil fi 1681.1Skamilfi 1691.1Skamil 1701.1Skamil cat > test.c << EOF 1711.1Skamil#include <stdio.h> 1721.1Skamil#include <stdlib.h> 1731.1Skamilvoid foo() { 1741.1Skamil int arr[5]; 1751.1Skamil for (int i = 0; i <= 5 ; i++) { 1761.1Skamil arr[i] = 0; 1771.1Skamil } 1781.1Skamil} 1791.1Skamilvoid main() {foo(); printf("CHECK\n"); exit(0);} 1801.1SkamilEOF 1811.1Skamil cc -fsanitize=address -o obo32 -m32 test.c 1821.1Skamil cc -fsanitize=address -o obo64 test.c 1831.1Skamil file -b ./obo32 > ./ftype32 1841.1Skamil file -b ./obo64 > ./ftype64 1851.1Skamil if diff ./ftype32 ./ftype64 >/dev/null; then 1861.1Skamil atf_fail "generated binaries do not differ" 1871.1Skamil fi 1881.1Skamil echo "32bit binaries on this platform are:" 1891.1Skamil cat ./ftype32 1901.1Skamil echo "While native (64bit) binaries are:" 1911.1Skamil cat ./ftype64 1921.1Skamil paxctl +a obo32 1931.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"stack-buffer-overflow" ./obo32 1941.1Skamil 1951.1Skamil# and another test with profile 32bit binaries 1961.1Skamil cat > test.c << EOF 1971.1Skamil#include <stdio.h> 1981.1Skamil#include <stdlib.h> 1991.1Skamilvoid foo() { 2001.1Skamil int arr[5]; 2011.1Skamil for (int i = 0; i <= 5 ; i++) { 2021.1Skamil arr[i] = 0; 2031.1Skamil } 2041.1Skamil} 2051.1Skamilvoid main() {foo(); printf("CHECK\n"); exit(0);} 2061.1SkamilEOF 2071.1Skamil cc -fsanitize=address -o test -pg test.c 2081.1Skamil paxctl +a test 2091.1Skamil atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"stack-buffer-overflow" ./test 2101.1Skamil} 2111.1Skamil 2121.1Skamiltarget_not_supported_body() 2131.1Skamil{ 2141.1Skamil atf_skip "Target is not supported" 2151.1Skamil} 2161.1Skamil 2171.1Skamilatf_init_test_cases() 2181.1Skamil{ 2191.1Skamil test_target 2201.1Skamil test $SUPPORT = 'n' && { 2211.1Skamil atf_add_test_case target_not_supported 2221.1Skamil return 0 2231.1Skamil } 2241.1Skamil 2251.1Skamil atf_add_test_case off_by_one 2261.1Skamil atf_add_test_case off_by_one_profile 2271.1Skamil atf_add_test_case off_by_one_pic 2281.1Skamil atf_add_test_case off_by_one_pie 2291.1Skamil atf_add_test_case off_by_one32 2301.1Skamil # static option not supported 2311.1Skamil # -static and -fsanitize=address can't be used together for compilation 2321.1Skamil # (gcc version 5.4.0 and clang 7.1) tested on April 2nd 2018. 2331.1Skamil} 234