Bug 363827: Implementation of memory leak checking. r=glen, sr=christophe

This commit is contained in:
slavomir.katuscak%sun.com 2007-02-08 17:53:12 +00:00
parent 88da57650a
commit f0af4a7b13
3 changed files with 726 additions and 0 deletions

View File

@ -0,0 +1,31 @@
#129218
/main/PL_CreateOptState/PR_Calloc/calloc
/main/PL_CreateOptState/PR_Malloc/malloc
/main/PL_CreateOptState/PR_Malloc
/main/PL_strdup/malloc
/main/PL_strdup
/main/PR_NewLock/PR_Calloc/calloc
#291225
/main/NSS_Initialize/*/SECMOD_LoadModule/**
#366553
/main/server_main/SSL_ConfigSecureServer/CERT_GetSSLCACerts/**
#366557
/main/_strdup
/main/strdup/malloc
#367133
/main/NSS_Initialize/*/STAN_LoadDefaultNSS3TrustDomain/**
#367374
/main/PR_Init/_PR_ImplicitInitialization/_PR_InitStuff/**
#367376
/main/launch_threads/PR_CreateThread/_PR_CreateThread/pthread_create@@GLIBC_2.1/**
/main/client_main/launch_thread/PR_CreateThread/_PR_CreateThread/pthread_create@@GLIBC_2.1/**
#367384
/main/NSS_Initialize/nss_Init/SECMOD_LoadModule/SECMOD_LoadModule/SECMOD_LoadPKCS11Module/secmod_ModuleInit/NSC_Initialize/nsc_CommonInitialize/RNG_RNGInit/freebl_RunLoaderOnce/PR_CallOnce/freebl_LoadDSO/bl_LoadLibrary/bl_LoadFreeblLibInSoftokenDir/PR_LoadLibraryWithFlags/pr_LoadLibraryByPathname/dlopen@@GLIBC_2.1/**
/main/NSS_Initialize/nss_Init/nss_FindExternalRoot/SECMOD_AddNewModule/SECMOD_AddNewModuleEx/SECMOD_AddModule/SECMOD_LoadPKCS11Module/PR_LoadLibrary/PR_LoadLibraryWithFlags/pr_LoadLibraryByPathname/DLLErrorInternal/**

View File

@ -0,0 +1,693 @@
#! /bin/sh
#
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The original code is the Network Security Services (NSS)
#
# The Initial Developer of the Original Code is
# Sun Microsystems, Inc.
# Portions created by the Initial Developer are Copyright (C) 2006-2007
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
# Slavomir Katuscak <slavomir.katuscak@sun.com>, Sun Microsystems Laboratories
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
########################################################################
#
# mozilla/security/nss/tests/memleak/memleak.sh
#
# Script to test memory leaks in NSS
#
# needs to work on Solaris and Linux platforms, on others just print a message
# that OS is not supported
#
# special strings
# ---------------
# FIXME ... known problems, search for this string
# NOTE .... unexpected behavior
#
########################################################################
############################# memleak_init #############################
# local shell function to initialize this script
########################################################################
memleak_init()
{
if [ -z "${INIT_SOURCED}" -o "${INIT_SOURCED}" != "TRUE" ]; then
cd ../common
. ./init.sh
fi
if [ ! -r ${CERT_LOG_FILE} ]; then
cd ../cert
. ./cert.sh
fi
SCRIPTNAME="memleak.sh"
if [ -z "${CLEANUP}" ] ; then
CLEANUP="${SCRIPTNAME}"
fi
NSS_DISABLE_ARENA_FREE_LIST="1"
export NSS_DISABLE_ARENA_FREE_LIST
OLD_LIBRARY_PATH=${LD_LIBRARY_PATH}
TMP_LIBDIR="${HOSTDIR}/tmp$$"
TMP_STACKS="${HOSTDIR}/stacks$$"
PORT=${PORT:-8443}
MODE_LIST="NORMAL BYPASS FIPS"
SERVER_DB="${HOSTDIR}/server_memleak"
CLIENT_DB="${HOSTDIR}/client_memleak"
cp -r ${HOSTDIR}/server ${SERVER_DB}
cp -r ${HOSTDIR}/client ${CLIENT_DB}
LOGDIR="${HOSTDIR}/memleak_logs"
mkdir -p ${LOGDIR}
FOUNDLEAKS="${LOGDIR}/foundleaks"
REQUEST_FILE="${QADIR}/memleak/sslreq.dat"
IGNORED_STACKS="${QADIR}/memleak/ignored"
echo ${OBJDIR} | grep "_64_" > /dev/null
if [ $? -eq 0 ] ; then
BIT_NAME="64"
else
BIT_NAME="32"
fi
case "${OS_NAME}" in
"SunOS")
DBX=`which dbx`
if [ $? -eq 0 ] ; then
echo "${SCRIPTNAME}: DBX found: ${DBX}"
else
echo "${SCRIPTNAME}: DBX not found, skipping memory leak checking."
exit 0
fi
PROC_ARCH=`uname -p`
if [ "${PROC_ARCH}" = "sparc" ] ; then
if [ "${BIT_NAME}" = "64" ] ; then
FREEBL_DEFAULT="libfreebl_64fpu_3"
FREEBL_LIST="${FREEBL_DEFAULT} libfreebl_64int_3"
else
FREEBL_DEFAULT="libfreebl_32fpu_3"
FREEBL_LIST="${FREEBL_DEFAULT} libfreebl_32int_3 libfreebl_32int64_3"
fi
else
if [ "${BIT_NAME}" = "64" ] ; then
echo "${SCRIPTNAME}: OS not supported for memory leak checking."
exit 0
fi
FREEBL_DEFAULT="libfreebl_3"
FREEBL_LIST="${FREEBL_DEFAULT}"
fi
RUN_SELFSERV_DBG="run_selfserv_dbx"
RUN_STRSCLNT_DBG="run_strsclnt_dbx"
PARSE_LOGFILE="parse_logfile_dbx"
;;
"Linux")
VALGRIND=`which valgrind`
if [ $? -eq 0 ] ; then
echo "${SCRIPTNAME}: Valgrind found: ${VALGRIND}"
else
echo "${SCRIPTNAME}: Valgrind not found, skipping memory leak checking."
exit 0
fi
if [ "${BIT_NAME}" = "64" ] ; then
echo "${SCRIPTNAME}: OS not supported for memory leak checking."
exit 0
fi
FREEBL_DEFAULT="libfreebl_3"
FREEBL_LIST="${FREEBL_DEFAULT}"
RUN_SELFSERV_DBG="run_selfserv_valgrind"
RUN_STRSCLNT_DBG="run_strsclnt_valgrind"
PARSE_LOGFILE="parse_logfile_valgrind"
;;
*)
echo "${SCRIPTNAME}: OS not supported for memory leak checking."
exit 0
;;
esac
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"
TSTCLNT_ATTR="-p ${PORT} -h ${HOSTADDR} -c j -f -d ${CLIENT_DB} -w nss"
tbytes=0
tblocks=0
}
########################### memleak_cleanup ############################
# local shell function to clean up after this script
########################################################################
memleak_cleanup()
{
. ${QADIR}/common/cleanup.sh
}
############################ set_test_mode #############################
# local shell function to set testing mode for server and for client
########################################################################
set_test_mode()
{
if [ "${server_mode}" = "BYPASS" ] ; then
echo "${SCRIPTNAME}: BYPASS is ON"
SERVER_OPTION="-B -s"
CLIENT_OPTION=""
elif [ "${client_mode}" = "BYPASS" ] ; then
echo "${SCRIPTNAME}: BYPASS is ON"
SERVER_OPTION=""
CLIENT_OPTION="-B -s"
else
echo "${SCRIPTNAME}: BYPASS is OFF"
SERVER_OPTION=""
CLIENT_OPTION=""
fi
if [ "${server_mode}" = "FIPS" ] ; then
modutil -dbdir ${SERVER_DB} -fips true -force
modutil -dbdir ${SERVER_DB} -list
modutil -dbdir ${CLIENT_DB} -fips false -force
modutil -dbdir ${CLIENT_DB} -list
echo "${SCRIPTNAME}: FIPS is ON"
cipher_list="c d e i j k n v y z"
elif [ "${client_mode}" = "FIPS" ] ; then
modutil -dbdir ${SERVER_DB} -fips false -force
modutil -dbdir ${SERVER_DB} -list
modutil -dbdir ${CLIENT_DB} -fips true -force
modutil -dbdir ${CLIENT_DB} -list
echo "${SCRIPTNAME}: FIPS is ON"
cipher_list="c d e i j k n v y z"
else
modutil -dbdir ${SERVER_DB} -fips false -force
modutil -dbdir ${SERVER_DB} -list
modutil -dbdir ${CLIENT_DB} -fips false -force
modutil -dbdir ${CLIENT_DB} -list
echo "${SCRIPTNAME}: FIPS is OFF"
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 l m n v y z"
fi
}
############################## set_freebl ##############################
# local shell function to set freebl - sets temporary path for libraries
########################################################################
set_freebl()
{
if [ "${freebl}" = "${FREEBL_DEFAULT}" ] ; then
LD_LIBRARY_PATH="${OLD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
else
if [ -d "${TMP_LIBDIR}" ] ; then
rm -rf ${TMP_LIBDIR}
fi
mkdir ${TMP_LIBDIR}
cp ${DIST}/${OBJDIR}/lib/*.so ${DIST}/${OBJDIR}/lib/*.chk ${TMP_LIBDIR}
echo "${SCRIPTNAME}: Using ${freebl} instead of ${FREEBL_DEFAULT}"
mv ${TMP_LIBDIR}/${FREEBL_DEFAULT}.so ${TMP_LIBDIR}/${FREEBL_DEFAULT}.so.orig
cp ${TMP_LIBDIR}/${freebl}.so ${TMP_LIBDIR}/${FREEBL_DEFAULT}.so
mv ${TMP_LIBDIR}/${FREEBL_DEFAULT}.chk ${TMP_LIBDIR}/${FREEBL_DEFAULT}.chk.orig
cp ${TMP_LIBDIR}/${freebl}.chk ${TMP_LIBDIR}/${FREEBL_DEFAULT}.chk
LD_LIBRARY_PATH="${TMP_LIBDIR}"
export LD_LIBRARY_PATH
fi
}
############################# clear_freebl #############################
# local shell function to set default library path and clear temporary
# directory for libraries created by function set_freebl
########################################################################
clear_freebl()
{
LD_LIBRARY_PATH="${OLD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
if [ -d "${TMP_LIBDIR}" ] ; then
rm -rf ${TMP_LIBDIR}
fi
}
############################# run_selfserv #############################
# local shell function to start selfserv
########################################################################
run_selfserv()
{
echo "PATH=${PATH}"
echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}"
echo "${SCRIPTNAME}: -------- Running selfserv:"
echo "selfserv ${SELFSERV_ATTR}"
selfserv ${SELFSERV_ATTR}
}
########################### run_selfserv_dbx ###########################
# local shell function to start selfserv under dbx tool
########################################################################
run_selfserv_dbx()
{
DBX_CMD="${HOSTDIR}/run_selfserv$$.dbx"
cat << EOF_DBX > ${DBX_CMD}
dbxenv follow_fork_mode parent
dbxenv rtc_mel_at_exit verbose
check -leaks -match 16 -frames 16
run ${SERVER_OPTION} ${SELFSERV_ATTR}
EOF_DBX
SELFSERV=`which selfserv`
echo "PATH=${PATH}"
echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}"
echo "${SCRIPTNAME}: -------- Running selfserv under DBX:"
echo "${DBX} ${SELFSERV} < ${DBX_CMD}"
echo "${SCRIPTNAME}: -------- DBX commands (${DBX_CMD}):"
cat ${DBX_CMD}
${DBX} ${SELFSERV} < ${DBX_CMD} 2>/dev/null | grep -v Reading
rm ${DBX_CMD}
}
######################### run_selfserv_valgrind ########################
# local shell function to start selfserv under valgrind tool
########################################################################
run_selfserv_valgrind()
{
echo "PATH=${PATH}"
echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}"
echo "${SCRIPTNAME}: -------- Running selfserv under Valgrind:"
echo "${VALGRIND} --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=50 selfserv ${SELFSERV_ATTR}"
${VALGRIND} --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=50 selfserv ${SELFSERV_ATTR}
}
############################ strsclnt_attr #############################
# local shell function to set strsclnt attributes and parameters
########################################################################
strsclnt_attr()
{
STRSCLNT_ATTR="-q -p ${PORT} -d ${CLIENT_DB} -w nss -c 1000 -C ${cipher} ${HOSTADDR}"
}
############################# run_strsclnt #############################
# local shell function to run strsclnt for all ciphers and send stop
# command to selfserv over tstclnt
########################################################################
run_strsclnt()
{
for cipher in ${cipher_list}; do
strsclnt_attr ${cipher}
echo "${SCRIPTNAME}: -------- Trying cipher ${cipher}:"
echo "strsclnt ${STRSCLNT_ATTR}"
strsclnt ${STRSCLNT_ATTR}
done
echo "PATH=${PATH}"
echo "LD_PATH=${LD_LIBRARY_PATH}"
echo "${SCRIPTNAME}: -------- Stopping server:"
echo "tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}"
tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}
}
########################### run_strsclnt_dbx ###########################
# local shell function to run strsclnt under dbx for all ciphers and
# send stop command to selfserv over tstclnt
########################################################################
run_strsclnt_dbx()
{
DBX_CMD="${HOSTDIR}/run_strsclnt$$.dbx"
for cipher in ${cipher_list}; do
strsclnt_attr ${cipher}
cat << EOF_DBX > ${DBX_CMD}
dbxenv follow_fork_mode parent
dbxenv rtc_mel_at_exit verbose
check -leaks -match 16 -frames 16
run ${CLIENT_OPTION} ${STRSCLNT_ATTR}
EOF_DBX
STRSCLNT=`which strsclnt`
echo "${SCRIPTNAME}: -------- Trying cipher ${cipher} under DBX:"
echo "${DBX} ${STRSCLNT} < ${DBX_CMD}"
echo "${SCRIPTNAME}: -------- DBX comands (${DBX_CMD}):"
cat ${DBX_CMD}
${DBX} ${STRSCLNT} < ${DBX_CMD} 2>/dev/null | grep -v Reading
done
echo "PATH=${PATH}"
echo "LD_PATH=${LD_LIBRARY_PATH}"
echo "${SCRIPTNAME}: -------- Stopping server:"
echo "tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}"
tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}
rm ${DBX_CMD}
}
######################## run_strsclnt_valgrind #########################
# local shell function to run strsclnt under valgrind for all ciphers
# and send stop command to selfserv over tstclnt
########################################################################
run_strsclnt_valgrind()
{
for cipher in ${cipher_list}; do
strsclnt_attr ${cipher}
echo "${SCRIPTNAME}: -------- Trying cipher ${cipher} under Valgrind:"
echo "${VALGRIND} --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=50 strsclnt ${STRSCLNT_ATTR}"
${VALGRIND} --tool=memcheck --leak-check=yes --show-reachable=yes --num-callers=50 strsclnt ${STRSCLNT_ATTR}
done
echo "PATH=${PATH}"
echo "LD_PATH=${LD_LIBRARY_PATH}"
echo "${SCRIPTNAME}: -------- Stopping server:"
echo "tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}"
tstclnt ${TSTCLNT_ATTR} < ${REQUEST_FILE}
}
########################## run_ciphers_server ##########################
# local shell function to test server part of code (selfserv)
########################################################################
run_ciphers_server()
{
html_head "Memory leak checking - server"
client_mode="NORMAL"
for server_mode in ${MODE_LIST}; do
set_test_mode
for freebl in ${FREEBL_LIST}; do
set_freebl
LOGNAME=server-${BIT_NAME}-${freebl}-${server_mode}
LOGFILE=${LOGDIR}/${LOGNAME}.log
echo "Running ${LOGNAME}"
${RUN_SELFSERV_DBG} 2>&1 | tee ${LOGFILE} &
sleep 5
run_strsclnt
sleep 20
clear_freebl
echo "" >> ${LOGFILE}
log_parse >> ${FOUNDLEAKS}
ret=$?
html_msg ${ret} 0 "${LOGNAME}" "produced a returncode of $ret, expected is 0"
done
done
html "</TABLE><BR>"
}
########################## run_ciphers_client ##########################
# local shell function to test client part of code (strsclnt)
########################################################################
run_ciphers_client()
{
html_head "Memory leak checking - client"
server_mode="NORMAL"
for client_mode in ${MODE_LIST}; do
set_test_mode
for freebl in ${FREEBL_LIST}; do
set_freebl
LOGNAME=client-${BIT_NAME}-${freebl}-${client_mode}
LOGFILE=${LOGDIR}/${LOGNAME}.log
echo "Running ${LOGNAME}"
run_selfserv &
sleep 5
${RUN_STRSCLNT_DBG} 2>&1 | tee ${LOGFILE}
sleep 20
clear_freebl
echo "" >> ${LOGFILE}
log_parse >> ${FOUNDLEAKS}
ret=$?
html_msg ${ret} 0 "${LOGNAME}" "produced a returncode of $ret, expected is 0"
done
done
html "</TABLE><BR>"
}
########################## parse_logfile_dbx ###########################
# local shell function to parse and process logs from dbx
########################################################################
parse_logfile_dbx()
{
in_mel=0
while read line
do
if [ "${line}" = "Memory Leak (mel):" -o "${line}" = "Possible memory leak -- address in block (aib):" ] ; then
in_mel=1
mel_line=0
stack_string=""
fi
if [ -z "${line}" ] ; then
if [ ${in_mel} -eq "1" ] ; then
in_mel=0
echo "${stack_string}"
fi
fi
if [ ${in_mel} -eq 1 ] ; then
mel_line=`expr ${mel_line} + 1`
if [ ${mel_line} -ge 4 ] ; then
new_line=`echo ${line} | cut -d" " -f2 | cut -d"(" -f1`
stack_string="/${new_line}${stack_string}"
fi
echo ${line} | grep "Found leaked block of size" > /dev/null
if [ $? -eq 0 ] ; then
lbytes=`echo ${line} | sed "s/Found leaked block of size \(.*\) bytes.*/\1/"`
tbytes=`expr "${tbytes}" + "${lbytes}"`
tblocks=`expr "${tblocks}" + 1`
fi
fi
done
}
######################## parse_logfile_valgrind ########################
# local shell function to parse and process logs from valgrind
########################################################################
parse_logfile_valgrind()
{
in_mel=0
in_sum=0
while read line
do
echo "${line}" | grep "^==" > /dev/null
if [ $? -ne 0 ] ; then
continue
fi
line=`echo "${line}" | sed "s/==[0-9]*==\s*\(.*\)/\1/"`
echo ${line} | grep "blocks are" > /dev/null
if [ $? -eq 0 ] ; then
in_mel=1
mel_line=0
stack_string=""
else
echo ${line} | grep "LEAK SUMMARY" > /dev/null
if [ $? -eq 0 ] ; then
in_sum=1
mel_line=0
fi
fi
if [ -z "${line}" ] ; then
if [ ${in_mel} -eq 1 ] ; then
in_mel=0
echo "${stack_string}"
elif [ ${in_sum} -eq 1 ] ; then
in_sum=0
fi
fi
if [ ${in_mel} -eq 1 ] ; then
mel_line=`expr ${mel_line} + 1`
if [ ${mel_line} -ge 2 ] ; then
new_line=`echo ${line} | sed "s/[^:]*:\ \(\S*\).*/\1/"`
if [ "${new_line}" = "(within" ] ; then
new_line="*"
fi
stack_string="/${new_line}${stack_string}"
fi
elif [ ${in_sum} -eq 1 ] ; then
mel_line=`expr ${mel_line} + 1`
if [ ${mel_line} -ge 2 ] ; then
echo ${line} | grep "bytes.*blocks" > /dev/null
if [ $? -eq 0 ] ; then
lbytes=`echo ${line} | sed "s/.*: \(.*\) bytes.*/\1/" | sed "s/,//g"`
lblocks=`echo ${line} | sed "s/.*bytes in \(.*\) blocks.*/\1/" | sed "s/,//g"`
tbytes=`expr "${tbytes}" + "${lbytes}"`
tblocks=`expr "${tblocks}" + "${lblocks}"`
else
in_sum=0
fi
fi
fi
done
}
############################# log_compare ##############################
# local shell function to check if selected stack is found in the list
# of ignored stacks
########################################################################
log_compare()
{
while read line
do
LINE="${line}"
STACK="${stack}"
if [ "${LINE}" = "${STACK}" ] ; then
return 0
fi
NEXT=0
echo "${LINE}" | grep '*' > /dev/null
if [ $? -ne 0 ] ; then
NEXT=1
fi
while [ "${LINE}" != "" -a ${NEXT} -ne 1 ]
do
L_WORD=`echo "${LINE}" | cut -d '/' -f1`
if ( echo "${LINE}" | grep '/' > /dev/null )
[ $? -eq 0 ] ; then
LINE=`echo "${LINE}" | cut -d '/' -f2-`
else
LINE=""
fi
S_WORD=`echo "${STACK}" | cut -d '/' -f1`
if ( echo "${STACK}" | grep '/' > /dev/null )
[ $? -eq 0 ] ; then
STACK=`echo "${STACK}" | cut -d '/' -f2-`
else
STACK=""
fi
if [ "${L_WORD}" = "**" ] ; then
return 0
fi
if [ "${L_WORD}" != "${S_WORD}" -a "${L_WORD}" != "*" -a "${S_WORD}" != "*" ] ; then
NEXT=1
break
fi
done
if [ "${LINE}" = "" -a "${STACK}" = "" ] ; then
return 0
fi
done
return 1
}
############################# check_ignored ############################
# local shell function to check all stacks if they are not ignored
########################################################################
check_ignored()
{
ret=0
while read stack
do
log_compare < ${IGNORED_STACKS}
if [ $? -eq 0 ] ; then
echo "IGNORED STACK: ${stack}"
else
ret=1
echo "NEW STACK: ${stack}"
fi
done
return ${ret}
}
############################### parse_log ##############################
# local shell function to parse log file
########################################################################
log_parse()
{
echo "${SCRIPTNAME}: Processing log ${LOGNAME}:"
${PARSE_LOGFILE} < ${LOGFILE} | sort -u | check_ignored
ret=$?
echo ""
return ${ret}
}
############################## cnt_total ###############################
# local shell function to count total leaked bytes
########################################################################
cnt_total()
{
echo ""
echo "TinderboxPrint:Lk bytes: ${tbytes}"
echo "TinderboxPrint:Lk blocks: ${tblocks}"
echo ""
}
################################# main #################################
memleak_init
run_ciphers_server
run_ciphers_client
cnt_total
memleak_cleanup

View File

@ -0,0 +1,2 @@
GET /stop HTTP/1.0