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