mirror of
https://github.com/Cisco-Talos/clamav.git
synced 2025-10-24 21:03:20 +00:00
This simplifies the various clamd/clamscan tests a lot, since the valgrind tests can now be parallelized by automake, and we don't need to do that in the script itself.
107 lines
3.2 KiB
Bash
Executable file
107 lines
3.2 KiB
Bash
Executable file
#!/bin/sh
|
|
#
|
|
# We don't look for 'still reachable' blocks, since clamd fork()s after loading
|
|
# the DB. The parent exits without freeing the memory (but they are freed
|
|
# anyway due to the exit).
|
|
# To test for DB load leaks, we issue a RELOAD command, which should cause
|
|
# leaks to be reported by valgrind if there are any.
|
|
#
|
|
|
|
test "x$VG" = "x1" || { echo "*** valgrind tests skipped by default, use 'make check VG=1' to activate"; exit 77; }
|
|
VALGRIND=`which ${VALGRIND-valgrind}`
|
|
test -n "$VALGRIND" || { echo "*** valgrind not found, skipping test"; exit 77; }
|
|
test -x "$VALGRIND" || { echo "*** valgrind not executable, skipping test"; exit 77; }
|
|
|
|
parse_valgrindlog()
|
|
{
|
|
if test ! -f $1; then
|
|
echo "*** Logfile $1 not found. Valgrind failed to run?"
|
|
fi
|
|
NRUNS=`grep -a "ERROR SUMMARY" $1 | wc -l`
|
|
if test $NRUNS -eq `grep -a "ERROR SUMMARY: 0 errors" $1 | wc -l` && test `grep -a "FATAL:" $1|wc -l ` -eq 0; then
|
|
if test "$1" = "valgrind-race.log" ||
|
|
test $NRUNS -eq `grep "no leaks are possible" $1 | wc -l` ||
|
|
test `grep "lost:" $1 | grep -v " 0 bytes" | wc -l` -eq 0; then
|
|
if test -z "$GENSUPP"; then
|
|
cp $1 /tmp
|
|
rm -f $1;
|
|
fi
|
|
return
|
|
else
|
|
echo "*** Valgrind test FAILED, memory LEAKS detected ***"
|
|
grep "lost:" $1 | grep -v " 0 bytes"
|
|
fi
|
|
else
|
|
if test "$1" = "valgrind-race.log" ; then
|
|
echo "*** Valgrind test FAILED, DATA RACES detected ****"
|
|
else
|
|
echo "*** Valgrind test FAILED, memory ERRORS detected ****"
|
|
fi
|
|
grep "ERROR SUMMARY" $1 | grep -v "0 errors"
|
|
sed -rn '
|
|
/^[=0-9]+ +at/ {
|
|
# save current line in hold buffer
|
|
x
|
|
# print hold buffer
|
|
p
|
|
# get original line back and print
|
|
x
|
|
p
|
|
}
|
|
# store it in hold buffer
|
|
h
|
|
' <$1 | grep -Ev "Thread.+was created" | grep -v "Open"
|
|
fi
|
|
echo "***"
|
|
echo "*** Please submit $1 to http://bugs.clamav.net"
|
|
echo "***"
|
|
}
|
|
|
|
if test "X$VALGRIND_GENSUPP" = "X1"; then
|
|
GENSUPP="--gen-suppressions=all"
|
|
else
|
|
GENSUPP=
|
|
fi
|
|
|
|
VALGRIND_COMMON_FLAGS="-v --trace-children=yes --suppressions=$abs_srcdir/valgrind.supp --error-exitcode=123 $GENSUPP"
|
|
VALGRIND_FLAGS="$VALGRIND_COMMON_FLAGS --track-fds=yes --leak-check=full"
|
|
VALGRIND_FLAGS_RACE="$VALGRIND_COMMON_FLAGS --tool=helgrind"
|
|
export CK_DEFAULT_TIMEOUT=40
|
|
echo "--- Starting check_clamav under valgrind/memcheck"
|
|
rm -f valgrind-check.log valgrind-clamd.log valgrind-race.log
|
|
CK_FORK=no ../libtool --mode=execute $VALGRIND $VALGRIND_FLAGS --log-file=valgrind-check.log ./check_clamav &
|
|
pid1=$!
|
|
|
|
echo "--- Starting clamd under valgrind/memcheck"
|
|
CLAMD_WRAPPER="$VALGRIND $VALGRIND_FLAGS --log-file=`pwd`/valgrind-clamd.log" $abs_srcdir/check_clamd.sh &
|
|
pid2=$!
|
|
|
|
echo "--- Starting clamd under valgrind/helgrind"
|
|
CLAMD_TEST_UNIQ1=3 CLAMD_TEST_UNIQ2=4 CLAMD_WRAPPER="$VALGRIND $VALGRIND_FLAGS_RACE --log-file=`pwd`/valgrind-race.log" $abs_srcdir/check_clamd.sh &
|
|
pid3=$!
|
|
|
|
errors=0
|
|
wait $pid1
|
|
if test $? -ne 0; then
|
|
# don't rm logs
|
|
GENSUPP=1
|
|
errors=1
|
|
fi
|
|
wait $pid2
|
|
if test $? -ne 0; then
|
|
GENSUPP=1
|
|
errors=1
|
|
fi
|
|
wait $pid3
|
|
if test $? -ne 0; then
|
|
GENSUPP=1
|
|
errors=1
|
|
fi
|
|
parse_valgrindlog valgrind-check.log
|
|
parse_valgrindlog valgrind-clamd.log
|
|
parse_valgrindlog valgrind-race.log
|
|
|
|
if test -f valgrind-check.log || test -f valgrind-race.log || test -f valgrind-clamd.log; then
|
|
exit 1;
|
|
fi
|
|
exit $errors
|