Blame nss/tests/memleak/memleak.sh

Packit 40b132
#!/bin/bash
Packit 40b132
#
Packit 40b132
# This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
# License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
Packit 40b132
Packit 40b132
########################################################################
Packit 40b132
#
Packit 40b132
# mozilla/security/nss/tests/memleak/memleak.sh
Packit 40b132
#
Packit 40b132
# Script to test memory leaks in NSS
Packit 40b132
#
Packit 40b132
# needs to work on Solaris and Linux platforms, on others just print a message
Packit 40b132
# that OS is not supported
Packit 40b132
#
Packit 40b132
# special strings
Packit 40b132
# ---------------
Packit 40b132
#   FIXME ... known problems, search for this string
Packit 40b132
#   NOTE .... unexpected behavior
Packit 40b132
#
Packit 40b132
########################################################################
Packit 40b132
Packit 40b132
############################# memleak_init #############################
Packit 40b132
# local shell function to initialize this script 
Packit 40b132
########################################################################
Packit 40b132
memleak_init()
Packit 40b132
{
Packit 40b132
	if [ -z "${INIT_SOURCED}" -o "${INIT_SOURCED}" != "TRUE" ]; then
Packit 40b132
		cd ../common
Packit 40b132
		. ./init.sh
Packit 40b132
	fi
Packit 40b132
	
Packit 40b132
	if [ ! -r ${CERT_LOG_FILE} ]; then
Packit 40b132
		cd ${QADIR}/cert
Packit 40b132
		. ./cert.sh
Packit 40b132
	fi
Packit 40b132
Packit 40b132
	SCRIPTNAME="memleak.sh"
Packit 40b132
	if [ -z "${CLEANUP}" ] ; then
Packit 40b132
		CLEANUP="${SCRIPTNAME}"
Packit 40b132
	fi
Packit 40b132
Packit 40b132
	OLD_LIBRARY_PATH=${LD_LIBRARY_PATH}
Packit 40b132
	TMP_LIBDIR="${HOSTDIR}/tmp"
Packit 40b132
	TMP_STACKS="${HOSTDIR}/stacks"
Packit 40b132
	TMP_SORTED="${HOSTDIR}/sorted"
Packit 40b132
	TMP_COUNT="${HOSTDIR}/count"
Packit 40b132
	DBXOUT="${HOSTDIR}/dbxout"
Packit 40b132
	DBXERR="${HOSTDIR}/dbxerr"
Packit 40b132
	DBXCMD="${HOSTDIR}/dbxcmd"
Packit 40b132
	
Packit 40b132
	PORT=${PORT:-8443}
Packit 40b132
	
Packit 40b132
	MODE_LIST="NORMAL BYPASS FIPS"
Packit 40b132
	
Packit 40b132
	SERVER_DB="${HOSTDIR}/server_memleak"
Packit 40b132
	CLIENT_DB="${HOSTDIR}/client_memleak"
Packit 40b132
	cp -r ${HOSTDIR}/server ${SERVER_DB}
Packit 40b132
	cp -r ${HOSTDIR}/client ${CLIENT_DB}
Packit 40b132
	
Packit 40b132
	LOGDIR="${HOSTDIR}/memleak_logs"
Packit 40b132
	mkdir -p ${LOGDIR}
Packit 40b132
Packit 40b132
	FOUNDLEAKS="${LOGDIR}/foundleaks"
Packit 40b132
	
Packit 40b132
	REQUEST_FILE="${QADIR}/memleak/sslreq.dat"
Packit 40b132
	IGNORED_STACKS="${QADIR}/memleak/ignored"
Packit 40b132
	
Packit 40b132
	gline=`echo ${OBJDIR} | grep "_64_"`
Packit 40b132
	if [ -n "${gline}" ] ; then
Packit 40b132
		BIT_NAME="64"
Packit 40b132
	else
Packit 40b132
		BIT_NAME="32"
Packit 40b132
	fi
Packit 40b132
		
Packit 40b132
	case "${OS_NAME}" in
Packit 40b132
	"SunOS")
Packit 40b132
		DBX=`which dbx`
Packit 40b132
		AWK=nawk
Packit 40b132
		
Packit 40b132
		if [ $? -eq 0 ] ; then
Packit 40b132
			echo "${SCRIPTNAME}: DBX found: ${DBX}"
Packit 40b132
		else
Packit 40b132
			echo "${SCRIPTNAME}: DBX not found, skipping memory leak checking."
Packit 40b132
			exit 0
Packit 40b132
		fi
Packit 40b132
		
Packit 40b132
		PROC_ARCH=`uname -p`
Packit 40b132
				
Packit 40b132
		if [ "${PROC_ARCH}" = "sparc" ] ; then
Packit 40b132
			if [ "${BIT_NAME}" = "64" ] ; then
Packit 40b132
				FREEBL_DEFAULT="libfreebl_64fpu_3"
Packit 40b132
				FREEBL_LIST="${FREEBL_DEFAULT} libfreebl_64int_3"
Packit 40b132
			else
Packit 40b132
				FREEBL_DEFAULT="libfreebl_32fpu_3"
Packit 40b132
				FREEBL_LIST="${FREEBL_DEFAULT} libfreebl_32int64_3"
Packit 40b132
			fi
Packit 40b132
		else
Packit 40b132
			if [ "${BIT_NAME}" = "64" ] ; then
Packit 40b132
				echo "${SCRIPTNAME}: OS not supported for memory leak checking."
Packit 40b132
				exit 0
Packit 40b132
			fi
Packit 40b132
			
Packit 40b132
			FREEBL_DEFAULT="libfreebl_3"
Packit 40b132
			FREEBL_LIST="${FREEBL_DEFAULT}"
Packit 40b132
		fi
Packit 40b132
		
Packit 40b132
		RUN_COMMAND_DBG="run_command_dbx"
Packit 40b132
		PARSE_LOGFILE="parse_logfile_dbx"
Packit 40b132
		;;
Packit 40b132
	"Linux")
Packit 40b132
		VALGRIND=`which valgrind`
Packit 40b132
		AWK=awk
Packit 40b132
		
Packit 40b132
		if [ $? -eq 0 ] ; then
Packit 40b132
			echo "${SCRIPTNAME}: Valgrind found: ${VALGRIND}"
Packit 40b132
		else
Packit 40b132
			echo "${SCRIPTNAME}: Valgrind not found, skipping memory leak checking."
Packit 40b132
			exit 0
Packit 40b132
		fi
Packit 40b132
Packit 40b132
		FREEBL_DEFAULT="libfreebl_3"
Packit 40b132
		FREEBL_LIST="${FREEBL_DEFAULT}"
Packit 40b132
				
Packit 40b132
		RUN_COMMAND_DBG="run_command_valgrind"
Packit 40b132
		PARSE_LOGFILE="parse_logfile_valgrind"
Packit 40b132
		;;
Packit 40b132
	*)
Packit 40b132
		echo "${SCRIPTNAME}: OS not supported for memory leak checking."
Packit 40b132
		exit 0
Packit 40b132
		;;
Packit 40b132
	esac
Packit 40b132
Packit 40b132
	if [ "${BUILD_OPT}" = "1" ] ; then
Packit 40b132
		OPT="OPT"
Packit 40b132
	else 
Packit 40b132
		OPT="DBG"
Packit 40b132
	fi
Packit 40b132
Packit 40b132
	NSS_DISABLE_UNLOAD="1"
Packit 40b132
	export NSS_DISABLE_UNLOAD
Packit 40b132
Packit 40b132
	SELFSERV_ATTR="-D -p ${PORT} -d ${SERVER_DB} -n ${HOSTADDR} -e ${HOSTADDR}-ec -w nss -c ABCDEF:C001:C002:C003:C004:C005:C006:C007:C008:C009:C00A:C00B:C00C:C00D:C00E:C00F:C010:C011:C012:C013:C014cdefgijklmnvyz -t 5"
Packit 40b132
	TSTCLNT_ATTR="-p ${PORT} -h ${HOSTADDR} -c j -f -d ${CLIENT_DB} -w nss -o"
Packit 40b132
	STRSCLNT_ATTR="-q -p ${PORT} -d ${CLIENT_DB} -w nss -c 1000 -n TestUser ${HOSTADDR}"
Packit 40b132
Packit 40b132
	tbytes=0
Packit 40b132
	tblocks=0
Packit 40b132
	truns=0
Packit 40b132
	
Packit 40b132
	MEMLEAK_DBG=1
Packit 40b132
	export MEMLEAK_DBG
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### memleak_cleanup ############################
Packit 40b132
# local shell function to clean up after this script 
Packit 40b132
########################################################################
Packit 40b132
memleak_cleanup()
Packit 40b132
{
Packit 40b132
	unset MEMLEAK_DBG
Packit 40b132
	unset NSS_DISABLE_UNLOAD
Packit 40b132
	
Packit 40b132
	. ${QADIR}/common/cleanup.sh
Packit 40b132
}
Packit 40b132
Packit 40b132
############################ set_test_mode #############################
Packit 40b132
# local shell function to set testing mode for server and for client
Packit 40b132
########################################################################
Packit 40b132
set_test_mode()
Packit 40b132
{
Packit 40b132
	if [ "${server_mode}" = "BYPASS" ] ; then
Packit 40b132
		echo "${SCRIPTNAME}: BYPASS is ON"
Packit 40b132
		SERVER_OPTION="-B -s"
Packit 40b132
		CLIENT_OPTION=""
Packit 40b132
	elif [ "${client_mode}" = "BYPASS" ] ; then
Packit 40b132
		echo "${SCRIPTNAME}: BYPASS is ON"
Packit 40b132
		SERVER_OPTION=""
Packit 40b132
		CLIENT_OPTION="-B -s"
Packit 40b132
	else
Packit 40b132
		echo "${SCRIPTNAME}: BYPASS is OFF"
Packit 40b132
		SERVER_OPTION=""
Packit 40b132
		CLIENT_OPTION=""
Packit 40b132
	fi
Packit 40b132
	
Packit 40b132
	if [ "${server_mode}" = "FIPS" ] ; then
Packit 40b132
		${BINDIR}/modutil -dbdir ${SERVER_DB} -fips true -force
Packit 40b132
		${BINDIR}/modutil -dbdir ${SERVER_DB} -list
Packit 40b132
		${BINDIR}/modutil -dbdir ${CLIENT_DB} -fips false -force
Packit 40b132
		${BINDIR}/modutil -dbdir ${CLIENT_DB} -list
Packit 40b132
		
Packit 40b132
		echo "${SCRIPTNAME}: FIPS is ON"
Packit 40b132
		cipher_list="c d e i j k n v y z"
Packit 40b132
	elif [ "${client_mode}" = "FIPS" ] ; then
Packit 40b132
		
Packit 40b132
		${BINDIR}/modutil -dbdir ${SERVER_DB} -fips false -force
Packit 40b132
		${BINDIR}/modutil -dbdir ${SERVER_DB} -list
Packit 40b132
		${BINDIR}/modutil -dbdir ${CLIENT_DB} -fips true -force
Packit 40b132
		${BINDIR}/modutil -dbdir ${CLIENT_DB} -list
Packit 40b132
		
Packit 40b132
		echo "${SCRIPTNAME}: FIPS is ON"
Packit 40b132
		cipher_list="c d e i j k n v y z"
Packit 40b132
	else
Packit 40b132
		${BINDIR}/modutil -dbdir ${SERVER_DB} -fips false -force
Packit 40b132
		${BINDIR}/modutil -dbdir ${SERVER_DB} -list
Packit 40b132
		${BINDIR}/modutil -dbdir ${CLIENT_DB} -fips false -force
Packit 40b132
		${BINDIR}/modutil -dbdir ${CLIENT_DB} -list
Packit 40b132
		
Packit 40b132
		echo "${SCRIPTNAME}: FIPS is OFF"
Packit 40b132
		# ciphers l and m removed, see bug 1136095
Packit 40b132
		cipher_list="A B C D E F :C001 :C002 :C003 :C004 :C005 :C006 :C007 :C008 :C009 :C00A :C010 :C011 :C012 :C013 :C014 c d e f g i j k n v y z"
Packit 40b132
	fi
Packit 40b132
}
Packit 40b132
Packit 40b132
############################## set_freebl ##############################
Packit 40b132
# local shell function to set freebl - sets temporary path for libraries
Packit 40b132
########################################################################
Packit 40b132
set_freebl()
Packit 40b132
{
Packit 40b132
	if [ "${freebl}" = "${FREEBL_DEFAULT}" ] ; then
Packit 40b132
		LD_LIBRARY_PATH="${OLD_LIBRARY_PATH}"
Packit 40b132
		export LD_LIBRARY_PATH
Packit 40b132
	else
Packit 40b132
		if [ -d "${TMP_LIBDIR}" ] ; then
Packit 40b132
			rm -rf ${TMP_LIBDIR}
Packit 40b132
		fi
Packit 40b132
Packit 40b132
		mkdir ${TMP_LIBDIR}
Packit 40b132
		[ $? -ne 0 ] && html_failed "Create temp directory" && return 1
Packit 40b132
Packit 40b132
		cp ${DIST}/${OBJDIR}/lib/*.so ${DIST}/${OBJDIR}/lib/*.chk ${TMP_LIBDIR}
Packit 40b132
		[ $? -ne 0 ] && html_failed "Copy libraries to temp directory" && return 1
Packit 40b132
		
Packit 40b132
		echo "${SCRIPTNAME}: Using ${freebl} instead of ${FREEBL_DEFAULT}"
Packit 40b132
Packit 40b132
		mv ${TMP_LIBDIR}/${FREEBL_DEFAULT}.so ${TMP_LIBDIR}/${FREEBL_DEFAULT}.so.orig
Packit 40b132
		[ $? -ne 0 ] && html_failed "Move ${FREEBL_DEFAULT}.so -> ${FREEBL_DEFAULT}.so.orig" && return 1
Packit 40b132
Packit 40b132
		cp ${TMP_LIBDIR}/${freebl}.so ${TMP_LIBDIR}/${FREEBL_DEFAULT}.so
Packit 40b132
		[ $? -ne 0 ] && html_failed "Copy ${freebl}.so -> ${FREEBL_DEFAULT}.so" && return 1
Packit 40b132
Packit 40b132
		mv ${TMP_LIBDIR}/${FREEBL_DEFAULT}.chk ${TMP_LIBDIR}/${FREEBL_DEFAULT}.chk.orig
Packit 40b132
		[ $? -ne 0 ] && html_failed "Move ${FREEBL_DEFAULT}.chk -> ${FREEBL_DEFAULT}.chk.orig" && return 1
Packit 40b132
Packit 40b132
		cp ${TMP_LIBDIR}/${freebl}.chk ${TMP_LIBDIR}/${FREEBL_DEFAULT}.chk
Packit 40b132
		[ $? -ne 0 ] && html_failed "Copy ${freebl}.chk to temp directory" && return 1
Packit 40b132
Packit 40b132
		echo "ls -l ${TMP_LIBDIR}"
Packit 40b132
		ls -l ${TMP_LIBDIR}
Packit 40b132
Packit 40b132
		LD_LIBRARY_PATH="${TMP_LIBDIR}"
Packit 40b132
		export LD_LIBRARY_PATH
Packit 40b132
	fi
Packit 40b132
Packit 40b132
	return 0
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# clear_freebl #############################
Packit 40b132
# local shell function to set default library path and clear temporary 
Packit 40b132
# directory for libraries created by function set_freebl 
Packit 40b132
########################################################################
Packit 40b132
clear_freebl()
Packit 40b132
{
Packit 40b132
	LD_LIBRARY_PATH="${OLD_LIBRARY_PATH}"
Packit 40b132
	export LD_LIBRARY_PATH
Packit 40b132
Packit 40b132
	if [ -d "${TMP_LIBDIR}" ] ; then
Packit 40b132
		rm -rf ${TMP_LIBDIR}
Packit 40b132
	fi
Packit 40b132
}
Packit 40b132
Packit 40b132
############################ run_command_dbx ###########################
Packit 40b132
# local shell function to run command under dbx tool
Packit 40b132
########################################################################
Packit 40b132
run_command_dbx()
Packit 40b132
{
Packit 40b132
	COMMAND=$1
Packit 40b132
	shift
Packit 40b132
	ATTR=$*
Packit 40b132
	
Packit 40b132
	COMMAND=`which ${COMMAND}`
Packit 40b132
	
Packit 40b132
	echo "dbxenv follow_fork_mode parent" > ${DBXCMD}
Packit 40b132
	echo "dbxenv rtc_mel_at_exit verbose" >> ${DBXCMD}
Packit 40b132
	echo "dbxenv rtc_biu_at_exit verbose" >> ${DBXCMD}
Packit 40b132
	echo "check -memuse -match 16 -frames 16" >> ${DBXCMD}
Packit 40b132
	echo "run ${ATTR}" >> ${DBXCMD}
Packit 40b132
	
Packit 40b132
	export NSS_DISABLE_ARENA_FREE_LIST=1
Packit 40b132
	
Packit 40b132
	echo "${SCRIPTNAME}: -------- Running ${COMMAND} under DBX:"
Packit 40b132
	echo "${DBX} ${COMMAND}"
Packit 40b132
	echo "${SCRIPTNAME}: -------- DBX commands:"
Packit 40b132
	cat ${DBXCMD}
Packit 40b132
	
Packit 40b132
	( ${DBX} ${COMMAND} < ${DBXCMD} > ${DBXOUT} 2> ${DBXERR} )
Packit 40b132
	grep -v Reading ${DBXOUT} 1>&2
Packit 40b132
	cat ${DBXERR}
Packit 40b132
	
Packit 40b132
	unset NSS_DISABLE_ARENA_FREE_LIST
Packit 40b132
	
Packit 40b132
	grep "exit code is" ${DBXOUT}
Packit 40b132
	grep "exit code is 0" ${DBXOUT} > /dev/null
Packit 40b132
	return $?
Packit 40b132
}
Packit 40b132
Packit 40b132
######################### run_command_valgrind #########################
Packit 40b132
# local shell function to run command under valgrind tool
Packit 40b132
########################################################################
Packit 40b132
run_command_valgrind()
Packit 40b132
{
Packit 40b132
	COMMAND=$1
Packit 40b132
	shift
Packit 40b132
	ATTR=$*
Packit 40b132
	
Packit 40b132
	export NSS_DISABLE_ARENA_FREE_LIST=1
Packit 40b132
	
Packit 40b132
	echo "${SCRIPTNAME}: -------- Running ${COMMAND} under Valgrind:"
Packit 40b132
	echo "${VALGRIND} --tool=memcheck --leak-check=yes --show-reachable=yes --partial-loads-ok=yes --leak-resolution=high --num-callers=50 ${COMMAND} ${ATTR}"
Packit 40b132
	echo "Running: ${COMMAND} ${ATTR}" 1>&2
Packit 40b132
	${VALGRIND} --tool=memcheck --leak-check=yes --show-reachable=yes --partial-loads-ok=yes --leak-resolution=high --num-callers=50 ${COMMAND} ${ATTR} 1>&2
Packit 40b132
	ret=$?
Packit 40b132
	echo "==0=="
Packit 40b132
	
Packit 40b132
	unset NSS_DISABLE_ARENA_FREE_LIST
Packit 40b132
	
Packit 40b132
	return $ret
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# run_selfserv #############################
Packit 40b132
# local shell function to start selfserv
Packit 40b132
########################################################################
Packit 40b132
run_selfserv()
Packit 40b132
{
Packit 40b132
	echo "PATH=${PATH}"
Packit 40b132
	echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}"
Packit 40b132
	echo "${SCRIPTNAME}: -------- Running selfserv:"
Packit 40b132
	echo "selfserv ${SELFSERV_ATTR}"
Packit 40b132
	${BINDIR}/selfserv ${SELFSERV_ATTR}
Packit 40b132
	ret=$?
Packit 40b132
	if [ $ret -ne 0 ]; then
Packit 40b132
		html_failed "${LOGNAME}: Selfserv"
Packit 40b132
		echo "${SCRIPTNAME} ${LOGNAME}: " \
Packit 40b132
			"Selfserv produced a returncode of ${ret} - FAILED"
Packit 40b132
	fi
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### run_selfserv_dbg ###########################
Packit 40b132
# local shell function to start selfserv under debug tool
Packit 40b132
########################################################################
Packit 40b132
run_selfserv_dbg()
Packit 40b132
{
Packit 40b132
	echo "PATH=${PATH}"
Packit 40b132
	echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}"
Packit 40b132
	${RUN_COMMAND_DBG} ${BINDIR}/selfserv ${SERVER_OPTION} ${SELFSERV_ATTR}
Packit 40b132
	ret=$?
Packit 40b132
	if [ $ret -ne 0 ]; then
Packit 40b132
		html_failed "${LOGNAME}: Selfserv"
Packit 40b132
		echo "${SCRIPTNAME} ${LOGNAME}: " \
Packit 40b132
			"Selfserv produced a returncode of ${ret} - FAILED"
Packit 40b132
	fi
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# run_strsclnt #############################
Packit 40b132
# local shell function to run strsclnt for all ciphers and send stop
Packit 40b132
# command to selfserv over tstclnt
Packit 40b132
########################################################################
Packit 40b132
run_strsclnt()
Packit 40b132
{
Packit 40b132
	for cipher in ${cipher_list}; do
Packit 40b132
		VMIN="ssl3"
Packit 40b132
		VMAX=
Packit 40b132
		case "${cipher}" in
Packit 40b132
		A|B|C|D|E|F)
Packit 40b132
			# Enable SSL 2 only for SSL 2 cipher suites.
Packit 40b132
			VMIN="ssl2"
Packit 40b132
			;;
Packit 40b132
		f|g)
Packit 40b132
			# TLS 1.1 disallows export cipher suites.
Packit 40b132
			VMAX="tls1.0"
Packit 40b132
			;;
Packit 40b132
		esac
Packit 40b132
		ATTR="${STRSCLNT_ATTR} -C ${cipher} -V ${VMIN}:${VMAX}"
Packit 40b132
		echo "${SCRIPTNAME}: -------- Trying cipher ${cipher}:"
Packit 40b132
		echo "strsclnt ${ATTR}"
Packit 40b132
		${BINDIR}/strsclnt ${ATTR}
Packit 40b132
		ret=$?
Packit 40b132
		if [ $ret -ne 0 ]; then
Packit 40b132
			html_failed "${LOGNAME}: Strsclnt with cipher ${cipher}"
Packit 40b132
			echo "${SCRIPTNAME} ${LOGNAME}: " \
Packit 40b132
				"Strsclnt produced a returncode of ${ret} - FAILED"
Packit 40b132
		fi
Packit 40b132
	done
Packit 40b132
	
Packit 40b132
	echo "${SCRIPTNAME}: -------- Stopping server:"
Packit 40b132
	echo "tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}"
Packit 40b132
	${BINDIR}/tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}
Packit 40b132
	ret=$?
Packit 40b132
	if [ $ret -ne 0 ]; then
Packit 40b132
		html_failed "${LOGNAME}: Tstclnt"
Packit 40b132
		echo "${SCRIPTNAME} ${LOGNAME}: " \
Packit 40b132
			"Tstclnt produced a returncode of ${ret} - FAILED"
Packit 40b132
	fi
Packit 40b132
	
Packit 40b132
	sleep 20
Packit 40b132
	kill $(jobs -p) 2> /dev/null
Packit 40b132
}
Packit 40b132
Packit 40b132
########################### run_strsclnt_dbg ###########################
Packit 40b132
# local shell function to run strsclnt under debug tool for all ciphers 
Packit 40b132
# and send stop command to selfserv over tstclnt
Packit 40b132
########################################################################
Packit 40b132
run_strsclnt_dbg()
Packit 40b132
{
Packit 40b132
	for cipher in ${cipher_list}; do
Packit 40b132
		VMIN="ssl3"
Packit 40b132
		VMAX=
Packit 40b132
		case "${cipher}" in
Packit 40b132
		A|B|C|D|E|F)
Packit 40b132
			# Enable SSL 2 only for SSL 2 cipher suites.
Packit 40b132
			VMIN="ssl2"
Packit 40b132
			;;
Packit 40b132
		f|g)
Packit 40b132
			# TLS 1.1 disallows export cipher suites.
Packit 40b132
			VMAX="tls1.0"
Packit 40b132
			;;
Packit 40b132
		esac
Packit 40b132
		ATTR="${STRSCLNT_ATTR} -C ${cipher} -V ${VMIN}:${VMAX}"
Packit 40b132
		${RUN_COMMAND_DBG} ${BINDIR}/strsclnt ${CLIENT_OPTION} ${ATTR}
Packit 40b132
		ret=$?
Packit 40b132
		if [ $ret -ne 0 ]; then
Packit 40b132
			html_failed "${LOGNAME}: Strsclnt with cipher ${cipher}"
Packit 40b132
			echo "${SCRIPTNAME} ${LOGNAME}: " \
Packit 40b132
				"Strsclnt produced a returncode of ${ret} - FAILED"
Packit 40b132
		fi
Packit 40b132
	done
Packit 40b132
	
Packit 40b132
	echo "${SCRIPTNAME}: -------- Stopping server:"
Packit 40b132
	echo "tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}"
Packit 40b132
	${BINDIR}/tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}
Packit 40b132
	ret=$?
Packit 40b132
	if [ $ret -ne 0 ]; then
Packit 40b132
		html_failed "${LOGNAME}: Tstclnt"
Packit 40b132
		echo "${SCRIPTNAME} ${LOGNAME}: " \
Packit 40b132
			"Tstclnt produced a returncode of ${ret} - FAILED"
Packit 40b132
	fi
Packit 40b132
	
Packit 40b132
	kill $(jobs -p) 2> /dev/null
Packit 40b132
}
Packit 40b132
Packit 40b132
stat_clear()
Packit 40b132
{
Packit 40b132
	stat_minbytes=9999999
Packit 40b132
	stat_maxbytes=0
Packit 40b132
	stat_minblocks=9999999
Packit 40b132
	stat_maxblocks=0
Packit 40b132
	stat_bytes=0
Packit 40b132
	stat_blocks=0
Packit 40b132
	stat_runs=0
Packit 40b132
}
Packit 40b132
Packit 40b132
stat_add()
Packit 40b132
{
Packit 40b132
	read hash lbytes bytes_str lblocks blocks_str in_str lruns runs_str \
Packit 40b132
		minbytes minbytes_str maxbytes maxbytes_str minblocks \
Packit 40b132
		minblocks_str maxblocks maxblocks_str rest < ${TMP_COUNT} 
Packit 40b132
	rm ${TMP_COUNT}
Packit 40b132
	
Packit 40b132
	tbytes=`expr ${tbytes} + ${lbytes}`
Packit 40b132
	tblocks=`expr ${tblocks} + ${lblocks}`
Packit 40b132
	truns=`expr ${truns} + ${lruns}`
Packit 40b132
	
Packit 40b132
	if [ ${stat_minbytes} -gt ${minbytes} ]; then
Packit 40b132
		stat_minbytes=${minbytes}
Packit 40b132
	fi
Packit 40b132
			
Packit 40b132
	if [ ${stat_maxbytes} -lt ${maxbytes} ]; then
Packit 40b132
		stat_maxbytes=${maxbytes}
Packit 40b132
	fi
Packit 40b132
			
Packit 40b132
	if [ ${stat_minblocks} -gt ${minblocks} ]; then
Packit 40b132
		stat_minblocks=${minblocks}
Packit 40b132
	fi
Packit 40b132
			
Packit 40b132
	if [ ${stat_maxblocks} -lt ${maxblocks} ]; then
Packit 40b132
		stat_maxblocks=${maxblocks}
Packit 40b132
	fi
Packit 40b132
			
Packit 40b132
	stat_bytes=`expr ${stat_bytes} + ${lbytes}`
Packit 40b132
	stat_blocks=`expr ${stat_blocks} + ${lblocks}`
Packit 40b132
	stat_runs=`expr ${stat_runs} + ${lruns}`
Packit 40b132
}
Packit 40b132
Packit 40b132
stat_print()
Packit 40b132
{
Packit 40b132
	if [ ${stat_runs} -gt 0 ]; then
Packit 40b132
		stat_avgbytes=`expr "${stat_bytes}" / "${stat_runs}"`
Packit 40b132
		stat_avgblocks=`expr "${stat_blocks}" / "${stat_runs}"`
Packit 40b132
		
Packit 40b132
		echo
Packit 40b132
		echo "$1 statistics:"
Packit 40b132
		echo "Leaked bytes: ${stat_minbytes} min, ${stat_avgbytes} avg, ${stat_maxbytes} max"
Packit 40b132
		echo "Leaked blocks: ${stat_minblocks} min, ${stat_avgblocks} avg, ${stat_maxblocks} max"
Packit 40b132
		echo "Total runs: ${stat_runs}"
Packit 40b132
		echo
Packit 40b132
	fi
Packit 40b132
}
Packit 40b132
Packit 40b132
########################## run_ciphers_server ##########################
Packit 40b132
# local shell function to test server part of code (selfserv)
Packit 40b132
########################################################################
Packit 40b132
run_ciphers_server()
Packit 40b132
{
Packit 40b132
	html_head "Memory leak checking - server"
Packit 40b132
	
Packit 40b132
	stat_clear
Packit 40b132
	
Packit 40b132
	client_mode="NORMAL"	
Packit 40b132
	for server_mode in ${MODE_LIST}; do
Packit 40b132
		set_test_mode
Packit 40b132
		
Packit 40b132
		for freebl in ${FREEBL_LIST}; do
Packit 40b132
			set_freebl || continue
Packit 40b132
			
Packit 40b132
			LOGNAME=server-${BIT_NAME}-${freebl}-${server_mode}
Packit 40b132
			LOGFILE=${LOGDIR}/${LOGNAME}.log
Packit 40b132
			echo "Running ${LOGNAME}"
Packit 40b132
			
Packit 40b132
			(
Packit 40b132
			    run_selfserv_dbg 2>> ${LOGFILE} &
Packit 40b132
			    sleep 5
Packit 40b132
			    run_strsclnt
Packit 40b132
			)
Packit 40b132
			
Packit 40b132
			sleep 20
Packit 40b132
			clear_freebl
Packit 40b132
			
Packit 40b132
			log_parse
Packit 40b132
			ret=$?
Packit 40b132
			
Packit 40b132
			html_msg ${ret} 0 "${LOGNAME}" "produced a returncode of $ret, expected is 0"
Packit 40b132
		done
Packit 40b132
	done
Packit 40b132
	
Packit 40b132
	stat_print "Selfserv"
Packit 40b132
	
Packit 40b132
	html "
"
Packit 40b132
}
Packit 40b132
Packit 40b132
########################## run_ciphers_client ##########################
Packit 40b132
# local shell function to test client part of code (strsclnt)
Packit 40b132
########################################################################
Packit 40b132
run_ciphers_client()
Packit 40b132
{
Packit 40b132
	html_head "Memory leak checking - client"
Packit 40b132
	
Packit 40b132
	stat_clear
Packit 40b132
	
Packit 40b132
	server_mode="NORMAL"
Packit 40b132
	for client_mode in ${MODE_LIST}; do
Packit 40b132
		set_test_mode
Packit 40b132
		
Packit 40b132
		for freebl in ${FREEBL_LIST}; do
Packit 40b132
			set_freebl || continue
Packit 40b132
			
Packit 40b132
			LOGNAME=client-${BIT_NAME}-${freebl}-${client_mode}
Packit 40b132
			LOGFILE=${LOGDIR}/${LOGNAME}.log
Packit 40b132
			echo "Running ${LOGNAME}"
Packit 40b132
			
Packit 40b132
			(
Packit 40b132
			    run_selfserv &
Packit 40b132
			    sleep 5
Packit 40b132
			    run_strsclnt_dbg 2>> ${LOGFILE}
Packit 40b132
			)
Packit 40b132
			
Packit 40b132
			sleep 20
Packit 40b132
			clear_freebl
Packit 40b132
			
Packit 40b132
			log_parse
Packit 40b132
			ret=$?
Packit 40b132
			html_msg ${ret} 0 "${LOGNAME}" "produced a returncode of $ret, expected is 0"
Packit 40b132
		done
Packit 40b132
	done
Packit 40b132
	
Packit 40b132
	stat_print "Strsclnt"
Packit 40b132
	
Packit 40b132
	html "
"
Packit 40b132
}
Packit 40b132
Packit 40b132
########################## parse_logfile_dbx ###########################
Packit 40b132
# local shell function to parse and process logs from dbx
Packit 40b132
########################################################################
Packit 40b132
parse_logfile_dbx()
Packit 40b132
{
Packit 40b132
	${AWK} '
Packit 40b132
	BEGIN {
Packit 40b132
		in_mel = 0
Packit 40b132
		mel_line = 0
Packit 40b132
		bytes = 0
Packit 40b132
		lbytes = 0
Packit 40b132
		minbytes = 9999999
Packit 40b132
		maxbytes = 0
Packit 40b132
		blocks = 0
Packit 40b132
		lblocks = 0
Packit 40b132
		minblocks = 9999999
Packit 40b132
		maxblocks = 0
Packit 40b132
		runs = 0
Packit 40b132
		stack_string = ""
Packit 40b132
		bin_name = ""
Packit 40b132
	}
Packit 40b132
	/Memory Leak \(mel\):/ ||
Packit 40b132
	/Possible memory leak -- address in block \(aib\):/ ||
Packit 40b132
	/Block in use \(biu\):/ {
Packit 40b132
		in_mel = 1
Packit 40b132
		stack_string = ""
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	in_mel == 1 && /^$/ {
Packit 40b132
		print bin_name stack_string
Packit 40b132
		in_mel = 0
Packit 40b132
		mel_line = 0
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	in_mel == 1 {
Packit 40b132
		mel_line += 1
Packit 40b132
	}
Packit 40b132
	/Found leaked block of size/ {
Packit 40b132
		bytes += $6
Packit 40b132
		blocks += 1
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	/Found .* leaked blocks/ {
Packit 40b132
		bytes += $8
Packit 40b132
		blocks += $2
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	/Found block of size/ {
Packit 40b132
		bytes += $5
Packit 40b132
		blocks += 1
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	/Found .* blocks totaling/ {
Packit 40b132
		bytes += $5
Packit 40b132
		blocks += $2
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	mel_line > 2 {
Packit 40b132
		gsub(/\(\)/, "")
Packit 40b132
		new_line = $2
Packit 40b132
		stack_string = "/" new_line stack_string
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	/^Running: / {
Packit 40b132
		bin_name = $2
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	/execution completed/ {
Packit 40b132
		runs += 1
Packit 40b132
		lbytes += bytes
Packit 40b132
		minbytes = (minbytes < bytes) ? minbytes : bytes
Packit 40b132
		maxbytes = (maxbytes > bytes) ? maxbytes : bytes
Packit 40b132
		bytes = 0
Packit 40b132
		lblocks += blocks
Packit 40b132
		minblocks = (minblocks < blocks) ? minblocks : blocks
Packit 40b132
		maxblocks = (maxblocks > blocks) ? maxblocks : blocks
Packit 40b132
		blocks = 0
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	END {
Packit 40b132
		print "# " lbytes " bytes " lblocks " blocks in " runs " runs " \
Packit 40b132
		minbytes " minbytes " maxbytes " maxbytes " minblocks " minblocks " \
Packit 40b132
		maxblocks " maxblocks " > "/dev/stderr"
Packit 40b132
	}' 2> ${TMP_COUNT}
Packit 40b132
	
Packit 40b132
	stat_add
Packit 40b132
}
Packit 40b132
Packit 40b132
######################## parse_logfile_valgrind ########################
Packit 40b132
# local shell function to parse and process logs from valgrind
Packit 40b132
########################################################################
Packit 40b132
parse_logfile_valgrind()
Packit 40b132
{
Packit 40b132
	${AWK} '
Packit 40b132
	BEGIN {
Packit 40b132
		in_mel = 0
Packit 40b132
		in_sum = 0
Packit 40b132
		bytes = 0
Packit 40b132
		lbytes = 0
Packit 40b132
		minbytes = 9999999
Packit 40b132
		maxbytes = 0
Packit 40b132
		blocks = 0
Packit 40b132
		lblocks = 0
Packit 40b132
		minblocks = 9999999
Packit 40b132
		maxblocks = 0
Packit 40b132
		runs = 0
Packit 40b132
		stack_string = ""
Packit 40b132
		bin_name = "" 
Packit 40b132
	}
Packit 40b132
	!/==[0-9]*==/ { 
Packit 40b132
		if ( $1 == "Running:" ) 
Packit 40b132
			bin_name = $2
Packit 40b132
			bin_nf = split(bin_name, bin_fields, "/")
Packit 40b132
			bin_name = bin_fields[bin_nf]
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	/blocks are/ {
Packit 40b132
		in_mel = 1
Packit 40b132
		stack_string = ""
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	/LEAK SUMMARY/ {
Packit 40b132
		in_sum = 1
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	/^==[0-9]*== *$/ { 
Packit 40b132
		if (in_mel)
Packit 40b132
			print bin_name stack_string
Packit 40b132
		if (in_sum) {
Packit 40b132
			runs += 1
Packit 40b132
			lbytes += bytes
Packit 40b132
			minbytes = (minbytes < bytes) ? minbytes : bytes
Packit 40b132
			maxbytes = (maxbytes > bytes) ? maxbytes : bytes
Packit 40b132
			bytes = 0
Packit 40b132
			lblocks += blocks
Packit 40b132
			minblocks = (minblocks < blocks) ? minblocks : blocks
Packit 40b132
			maxblocks = (maxblocks > blocks) ? maxblocks : blocks
Packit 40b132
			blocks = 0
Packit 40b132
		}
Packit 40b132
		in_sum = 0
Packit 40b132
		in_mel = 0
Packit 40b132
		next
Packit 40b132
	}
Packit 40b132
	in_mel == 1 {	
Packit 40b132
		new_line = $4
Packit 40b132
		if ( new_line == "(within")
Packit 40b132
			new_line = "*"
Packit 40b132
		stack_string = "/" new_line stack_string
Packit 40b132
	}
Packit 40b132
	in_sum == 1 {
Packit 40b132
		for (i = 2; i <= NF; i++) {
Packit 40b132
			if ($i == "bytes") {
Packit 40b132
				str = $(i - 1)
Packit 40b132
				gsub(",", "", str)
Packit 40b132
				bytes += str
Packit 40b132
			}
Packit 40b132
			if ($i == "blocks.") {
Packit 40b132
				str = $(i - 1)
Packit 40b132
				gsub(",", "", str)
Packit 40b132
				blocks += str
Packit 40b132
			}
Packit 40b132
		}
Packit 40b132
	}
Packit 40b132
	END {
Packit 40b132
		print "# " lbytes " bytes " lblocks " blocks in " runs " runs " \
Packit 40b132
		minbytes " minbytes " maxbytes " maxbytes " minblocks " minblocks " \
Packit 40b132
		maxblocks " maxblocks " > "/dev/stderr"
Packit 40b132
	}' 2> ${TMP_COUNT}
Packit 40b132
	
Packit 40b132
	stat_add
Packit 40b132
}
Packit 40b132
Packit 40b132
############################# check_ignored ############################
Packit 40b132
# local shell function to check all stacks if they are not ignored
Packit 40b132
########################################################################
Packit 40b132
check_ignored()
Packit 40b132
{
Packit 40b132
	${AWK} -F/ '
Packit 40b132
	BEGIN {
Packit 40b132
		ignore = "'${IGNORED_STACKS}'"
Packit 40b132
		# read in the ignore file
Packit 40b132
		BUGNUM = ""
Packit 40b132
		count = 0
Packit 40b132
		new = 0
Packit 40b132
		while ((getline line < ignore) > 0)  {
Packit 40b132
			if (line ~ "^#[0-9]+") {
Packit 40b132
				BUGNUM = line
Packit 40b132
			} else if (line ~ "^#") {
Packit 40b132
				continue
Packit 40b132
			} else if (line == "") {
Packit 40b132
				continue
Packit 40b132
			} else {
Packit 40b132
				bugnum_array[count] = BUGNUM
Packit 40b132
				# Create a regular expression for the ignored stack:
Packit 40b132
				# replace * with % so we can later replace them with regular expressions
Packit 40b132
				# without messing up everything (the regular expressions contain *)
Packit 40b132
				gsub("\\*", "%", line)
Packit 40b132
				# replace %% with .*
Packit 40b132
				gsub("%%", ".*", line)
Packit 40b132
				# replace % with [^/]*
Packit 40b132
				gsub("%", "[^/]*", line)
Packit 40b132
				# add ^ at the beginning
Packit 40b132
				# add $ at the end
Packit 40b132
				line_array[count] = "^" line "$"
Packit 40b132
				count++
Packit 40b132
			}
Packit 40b132
		}
Packit 40b132
	}
Packit 40b132
	{
Packit 40b132
		match_found = 0
Packit 40b132
		# Look for matching ignored stack
Packit 40b132
		for (i = 0; i < count; i++) {
Packit 40b132
			if ($0 ~ line_array[i]) {
Packit 40b132
				# found a match
Packit 40b132
				match_found = 1
Packit 40b132
				bug_found = bugnum_array[i]
Packit 40b132
				break
Packit 40b132
			}
Packit 40b132
		}
Packit 40b132
		# Process result
Packit 40b132
		if (match_found == 1 ) {
Packit 40b132
				if (bug_found != "") {
Packit 40b132
					print "IGNORED STACK (" bug_found "): " $0
Packit 40b132
				} else {
Packit 40b132
					print "IGNORED STACK: " $0
Packit 40b132
				}
Packit 40b132
		} else {
Packit 40b132
				print "NEW STACK: " $0
Packit 40b132
				new = 1
Packit 40b132
		}
Packit 40b132
	}
Packit 40b132
	END {
Packit 40b132
		exit new
Packit 40b132
	}'
Packit 40b132
	ret=$?
Packit 40b132
	return $ret
Packit 40b132
}
Packit 40b132
Packit 40b132
############################### parse_log ##############################
Packit 40b132
# local shell function to parse log file
Packit 40b132
########################################################################
Packit 40b132
log_parse()
Packit 40b132
{
Packit 40b132
	${PARSE_LOGFILE} < ${LOGFILE} > ${TMP_STACKS}
Packit 40b132
	echo "${SCRIPTNAME}: Processing log ${LOGNAME}:" > ${TMP_SORTED}
Packit 40b132
	cat ${TMP_STACKS} | sort -u | check_ignored >> ${TMP_SORTED}
Packit 40b132
	ret=$?
Packit 40b132
	echo >> ${TMP_SORTED}
Packit 40b132
	
Packit 40b132
	cat ${TMP_SORTED} | tee -a ${FOUNDLEAKS}
Packit 40b132
	rm ${TMP_STACKS} ${TMP_SORTED}
Packit 40b132
	
Packit 40b132
	return ${ret}
Packit 40b132
}
Packit 40b132
Packit 40b132
############################## cnt_total ###############################
Packit 40b132
# local shell function to count total leaked bytes
Packit 40b132
########################################################################
Packit 40b132
cnt_total()
Packit 40b132
{
Packit 40b132
	echo ""
Packit 40b132
	echo "TinderboxPrint:${OPT} Lk bytes: ${tbytes}"
Packit 40b132
	echo "TinderboxPrint:${OPT} Lk blocks: ${tblocks}"
Packit 40b132
	echo "TinderboxPrint:${OPT} # of runs: ${truns}"
Packit 40b132
	echo ""
Packit 40b132
}
Packit 40b132
Packit 40b132
############################### run_ocsp ###############################
Packit 40b132
# local shell function to run ocsp tests
Packit 40b132
########################################################################
Packit 40b132
run_ocsp()
Packit 40b132
{
Packit 40b132
	stat_clear
Packit 40b132
	
Packit 40b132
	cd ${QADIR}/iopr
Packit 40b132
	. ./ocsp_iopr.sh
Packit 40b132
	ocsp_iopr_run
Packit 40b132
	
Packit 40b132
	stat_print "Ocspclnt"
Packit 40b132
}
Packit 40b132
Packit 40b132
############################## run_chains ##############################
Packit 40b132
# local shell function to run PKIX certificate chains tests
Packit 40b132
########################################################################
Packit 40b132
run_chains()
Packit 40b132
{
Packit 40b132
    stat_clear
Packit 40b132
Packit 40b132
    LOGNAME="chains"
Packit 40b132
    LOGFILE=${LOGDIR}/chains.log
Packit 40b132
Packit 40b132
    . ${QADIR}/chains/chains.sh
Packit 40b132
Packit 40b132
    stat_print "Chains"
Packit 40b132
}
Packit 40b132
Packit 40b132
############################## run_chains ##############################
Packit 40b132
# local shell function to run memory leak tests
Packit 40b132
#
Packit 40b132
# NSS_MEMLEAK_TESTS - list of tests to run, if not defined before,
Packit 40b132
# then is redefined to default list 
Packit 40b132
########################################################################
Packit 40b132
memleak_run_tests()
Packit 40b132
{
Packit 40b132
    nss_memleak_tests="ssl_server ssl_client chains ocsp"
Packit 40b132
    NSS_MEMLEAK_TESTS="${NSS_MEMLEAK_TESTS:-$nss_memleak_tests}"
Packit 40b132
Packit 40b132
    for MEMLEAK_TEST in ${NSS_MEMLEAK_TESTS}
Packit 40b132
    do
Packit 40b132
        case "${MEMLEAK_TEST}" in
Packit 40b132
        "ssl_server")
Packit 40b132
            run_ciphers_server
Packit 40b132
            ;;
Packit 40b132
        "ssl_client")
Packit 40b132
            run_ciphers_client
Packit 40b132
            ;;
Packit 40b132
        "chains")
Packit 40b132
            run_chains
Packit 40b132
            ;;
Packit 40b132
        "ocsp")
Packit 40b132
            run_ocsp
Packit 40b132
            ;;
Packit 40b132
        esac
Packit 40b132
    done
Packit 40b132
}
Packit 40b132
Packit 40b132
################################# main #################################
Packit 40b132
Packit 40b132
memleak_init
Packit 40b132
memleak_run_tests
Packit 40b132
cnt_total
Packit 40b132
memleak_cleanup
Packit 40b132