t_asan_global_buffer_overflow.sh revision 1.1
11.1Skamil#	$NetBSD: t_asan_global_buffer_overflow.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 global_buffer_overflow
431.1Skamilglobal_buffer_overflow_head() {
441.1Skamil	atf_set "descr" "compile and run \"Global Buffer Overflow example\""
451.1Skamil	atf_set "require.progs" "cc paxctl"
461.1Skamil}
471.1Skamil
481.1Skamilatf_test_case global_buffer_overflow_profile
491.1Skamilglobal_buffer_overflow_profile_head() {
501.1Skamil	atf_set "descr" "compile and run \"Global Buffer Overflow example\" with profiling option"
511.1Skamil	atf_set "require.progs" "cc paxctl"
521.1Skamil}
531.1Skamil
541.1Skamilatf_test_case global_buffer_overflow_pic
551.1Skamilglobal_buffer_overflow_pic_head() {
561.1Skamil	atf_set "descr" "compile and run PIC \"Global Buffer Overflow example\""
571.1Skamil	atf_set "require.progs" "cc paxctl"
581.1Skamil}
591.1Skamil
601.1Skamilatf_test_case global_buffer_overflow_pie
611.1Skamilglobal_buffer_overflow_pie_head() {
621.1Skamil	atf_set "descr" "compile and run position independent (PIE) \"Global Buffer Overflow example\""
631.1Skamil	atf_set "require.progs" "cc paxctl"
641.1Skamil}
651.1Skamil
661.1Skamilatf_test_case global_buffer_overflow32
671.1Skamilglobal_buffer_overflow32_head() {
681.1Skamil	atf_set "descr" "compile and run \"Global Buffer Overflow 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.1Skamilglobal_buffer_overflow_body() {
791.1Skamil	cat > test.c << EOF
801.1Skamil#include <stdio.h>
811.1Skamil#include <stdlib.h>
821.1Skamilint arr[5] = {-1};
831.1Skamilvoid foo(int index) { arr[index] = 0; }
841.1Skamilvoid main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);}
851.1SkamilEOF
861.1Skamil	cc -fsanitize=address -o test test.c
871.1Skamil	paxctl -a test
881.1Skamil	atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test
891.1Skamil}
901.1Skamil
911.1Skamilglobal_buffer_overflow_profile_body() {
921.1Skamil	cat > test.c << EOF
931.1Skamil#include <stdio.h>
941.1Skamil#include <stdlib.h>
951.1Skamilint arr[5] = {-1};
961.1Skamilvoid foo(int index) { arr[index] = 0; }
971.1Skamilvoid main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);}
981.1SkamilEOF
991.1Skamil	cc -fsanitize=address -o test -pg test.c
1001.1Skamil	paxctl +a test
1011.1Skamil	atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test
1021.1Skamil}
1031.1Skamil
1041.1Skamilglobal_buffer_overflow_pic_body() {
1051.1Skamil	cat > test.c << EOF
1061.1Skamil#include <stdio.h>
1071.1Skamil#include <stdlib.h>
1081.1Skamilvoid foo(int);
1091.1Skamilvoid main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);}
1101.1SkamilEOF
1111.1Skamil	cat > pic.c << EOF
1121.1Skamil#include <stdio.h>
1131.1Skamil#include <stdlib.h>
1141.1Skamilint arr[5] = {-1};
1151.1Skamilvoid foo(int index) { arr[index] = 0; }
1161.1SkamilEOF
1171.1Skamil
1181.1Skamil	cc -fPIC -fsanitize=address -shared -o libtest.so pic.c
1191.1Skamil	cc -o test test.c -fsanitize=address -L. -ltest
1201.1Skamil	paxctl +a test
1211.1Skamil
1221.1Skamil	export LD_LIBRARY_PATH=.
1231.1Skamil	atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test
1241.1Skamil}
1251.1Skamil
1261.1Skamilglobal_buffer_overflow_pie_body() {
1271.1Skamil	# check whether this arch supports -pice
1281.1Skamil	if ! cc -pie -dM -E - < /dev/null 2>/dev/null >/dev/null; then
1291.1Skamil		atf_set_skip "cc -pie not supported on this architecture"
1301.1Skamil	fi
1311.1Skamil	cat > test.c << EOF
1321.1Skamil#include <stdio.h>
1331.1Skamil#include <stdlib.h>
1341.1Skamilint arr[5] = {-1};
1351.1Skamilvoid foo(int index) { arr[index] = 0; }
1361.1Skamilvoid main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);}
1371.1SkamilEOF
1381.1Skamil	cc -fsanitize=address -fpie -pie -o test test.c
1391.1Skamil	paxctl +a test
1401.1Skamil	atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test
1411.1Skamil}
1421.1Skamil
1431.1Skamilglobal_buffer_overflow32_body() {
1441.1Skamil	# check whether this arch is 64bit
1451.1Skamil	if ! cc -dM -E - < /dev/null | fgrep -q _LP64; then
1461.1Skamil		atf_skip "this is not a 64 bit architecture"
1471.1Skamil	fi
1481.1Skamil	if ! cc -m32 -dM -E - < /dev/null 2>/dev/null > ./def32; then
1491.1Skamil		atf_skip "cc -m32 not supported on this architecture"
1501.1Skamil	else
1511.1Skamil		if fgrep -q _LP64 ./def32; then
1521.1Skamil		atf_fail "cc -m32 does not generate netbsd32 binaries"
1531.1Skamil	fi
1541.1Skamilfi
1551.1Skamil
1561.1Skamil	cat > test.c << EOF
1571.1Skamil#include <stdio.h>
1581.1Skamil#include <stdlib.h>
1591.1Skamilint arr[5] = {-1};
1601.1Skamilvoid foo(int index) { arr[index] = 0; }
1611.1Skamilvoid main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);}
1621.1SkamilEOF
1631.1Skamil	cc -fsanitize=address -o gbof32 -m32 test.c
1641.1Skamil	cc -fsanitize=address -o gbof64 test.c
1651.1Skamil	file -b ./gbof32 > ./ftype32
1661.1Skamil	file -b ./gbof64 > ./ftype64
1671.1Skamil	if diff ./ftype32 ./ftype64 >/dev/null; then
1681.1Skamil		atf_fail "generated binaries do not differ"
1691.1Skamil	fi
1701.1Skamil	echo "32bit binaries on this platform are:"
1711.1Skamil	cat ./ftype32
1721.1Skamil	echo "While native (64bit) binaries are:"
1731.1Skamil	cat ./ftype64
1741.1Skamil	paxctl +a gbof32
1751.1Skamil	atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./gbof32
1761.1Skamil
1771.1Skamil# and another test with profile 32bit binaries
1781.1Skamil	cat > test.c << EOF
1791.1Skamil#include <stdio.h>
1801.1Skamil#include <stdlib.h>
1811.1Skamilint arr[5] = {-1};
1821.1Skamilvoid foo(int index) { arr[index] = 0; }
1831.1Skamilvoid main(int argc, char **argv) {foo(argc + 5); printf("CHECK\n"); exit(0);}
1841.1SkamilEOF
1851.1Skamil	cc -o test -m32 -fsanitize=address -pg test.c
1861.1Skamil	paxctl +a test
1871.1Skamil	atf_check -s not-exit:0 -o not-match:"CHECK\n" -e match:"global-buffer-overflow" ./test
1881.1Skamil}
1891.1Skamil
1901.1Skamiltarget_not_supported_body()
1911.1Skamil{
1921.1Skamil	atf_skip "Target is not supported"
1931.1Skamil}
1941.1Skamil
1951.1Skamilatf_init_test_cases()
1961.1Skamil{
1971.1Skamil	test_target
1981.1Skamil	test $SUPPORT = 'n' && {
1991.1Skamil		atf_add_test_case target_not_supported
2001.1Skamil		return 0
2011.1Skamil	}
2021.1Skamil
2031.1Skamil	atf_add_test_case global_buffer_overflow
2041.1Skamil	atf_add_test_case global_buffer_overflow_profile
2051.1Skamil	atf_add_test_case global_buffer_overflow_pic
2061.1Skamil	atf_add_test_case global_buffer_overflow_pie
2071.1Skamil	atf_add_test_case global_buffer_overflow32
2081.1Skamil	# static option not supported
2091.1Skamil	# -static and -fsanitize=address can't be used together for compilation
2101.1Skamil	# (gcc version  5.4.0 and clang 7.1) tested on April 2nd 2018.
2111.1Skamil}
212