Add some valgrind checks (thanks to okozina).
authorMilan Broz <gmazyland@gmail.com>
Wed, 21 Sep 2011 22:42:03 +0000 (22:42 +0000)
committerMilan Broz <gmazyland@gmail.com>
Wed, 21 Sep 2011 22:42:03 +0000 (22:42 +0000)
git-svn-id: https://cryptsetup.googlecode.com/svn/trunk@609 36d66b0a-2a48-0410-832c-cd162a569da5

tests/Makefile.am
tests/compat-test
tests/cryptsetup-valg-supps [new file with mode: 0644]
tests/valg-api.sh [new file with mode: 0755]
tests/valg.sh [new file with mode: 0755]

index 5762768..d9580a1 100644 (file)
@@ -5,9 +5,10 @@ EXTRA_DIST = compatimage.img.bz2 valid_header_file.bz2 \
        evil_hdr-stripes_payload_dmg.bz2 \
        evil_hdr-luks_hdr_damage.bz2 \
        evil_hdr-small_luks_device.bz2 \
-       compat-test loopaes-test align-test discards-test mode-test password-hash-test
+       compat-test loopaes-test align-test discards-test mode-test password-hash-test \
+       cryptsetup-valg-supps valg.sh valg-api.sh
 
-CLEANFILES = cryptsetuptst.*
+CLEANFILES = cryptsetup-tst* valglog*
 
 differ_SOURCES = differ.c
 differ_CFLAGS = -Wall -O2
@@ -21,3 +22,9 @@ check_PROGRAMS = api-test differ
 
 compatimage.img:
        @bzip2 -k -d compatimage.img.bz2
+
+valgrind-check: api-test differ
+       @VALG=1 ./compat-test
+       @INFOSTRING="api-test-000" ./valg-api.sh ./api-test
+
+.PHONY: valgrind-check
index dcf3d5a..11fa62d 100755 (executable)
@@ -34,6 +34,7 @@ function remove_mapping()
 
 function fail()
 {
+       [ -n "$1" ] && echo "$1"
        remove_mapping
        echo "FAILED"
        exit 2
@@ -94,9 +95,27 @@ function check_exists()
        check $1
 }
 
+function valgrind_setup()
+{
+       which valgrind >/dev/null 2>&1 || fail "Cannot find valgrind"
+
+       CRYPTSETUP_BIN=$($CRYPTSETUP --lt-debug --version 2>&1 \
+                       | grep "newargv\[0\]" \
+                       | sed 's/.*newargv\[0\]\:[[:space:]]\+\(.*\)$/\1/g')
+       [ -z "$CRYPTSETUP_BIN" ] && fail "Unable to get location of cryptsetup executable."
+       export LD_LIBRARY_PATH="../lib/.libs:$LD_LIBRARY_PATH"
+}
+
+function valgrind_run()
+{
+       INFOSTRING="$(basename ${BASH_SOURCE[1]})-line-${BASH_LINENO[0]}" ./valg.sh ${CRYPTSETUP_BIN} "$@"
+}
+
 [ $(id -u) != 0 ] && skip "WARNING: You must be root to run this test, test skipped."
 [ -z "$LOOPDEV" ] && skip "Cannot find free loop device, test skipped."
 
+[ -n "$VALG" ] && valgrind_setup && CRYPTSETUP=valgrind_run
+
 # LUKS tests
 
 prepare        "[1] open - compat image - acceptance check" new
diff --git a/tests/cryptsetup-valg-supps b/tests/cryptsetup-valg-supps
new file mode 100644 (file)
index 0000000..72bf652
--- /dev/null
@@ -0,0 +1,47 @@
+# Supresion file for valgrind
+
+# known problem in libgcrypt
+{
+   leak_in_libgcrypt_00
+   Memcheck:Leak
+   fun:malloc
+   obj:/lib64/libgcrypt.so*
+   ...
+   obj:/lib64/libgcrypt.so*
+   fun:crypt_backend_init
+   fun:init_crypto
+   ...
+}
+# TODO soon... we use global static errno to be read
+# from device context or from library default logging
+{
+   errno_leak_utils
+   Memcheck:Leak
+   fun:*lloc
+   obj:/lib*/libc*.so
+   fun:set_error_va
+   fun:set_error
+   ...
+}
+# following leaks/errors are addressed to libpopt...
+{
+  popt_read_error
+  Memcheck:Addr4
+  obj:/lib*/libpopt.so*
+  fun:poptGetNextOpt
+  fun:main
+}
+{
+  popt_leak_poptGetNextOpt_00
+  Memcheck:Leak
+  fun:realloc
+  fun:poptGetNextOpt
+  fun:main
+}
+{
+  popt_leak_poptGetNextOpt_01
+  Memcheck:Leak
+  fun:malloc
+  fun:poptGetNextOpt
+  fun:main
+}
diff --git a/tests/valg-api.sh b/tests/valg-api.sh
new file mode 100755 (executable)
index 0000000..e27a269
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+SUP="--suppressions=./cryptsetup-valg-supps"
+CHILD="--trace-children=no --child-silent-after-fork=yes"
+MALLOC="--malloc-fill=aa"
+FREE="--free-fill=21"
+STACK="--max-stackframe=300000"
+EXTRAS="--read-var-info=yes --show-reachable=yes"
+LOGFILE="--log-file=./valglog.$(date +%s)_${INFOSTRING}"
+LEAKCHECK="--leak-check=full --track-origins=yes"
+
+exec valgrind  $SUP $GETSUP $CHILD $MALLOC $FREE $STACK $EXTRAS $LOGFILE  $LEAKCHECK "$@"
diff --git a/tests/valg.sh b/tests/valg.sh
new file mode 100755 (executable)
index 0000000..82a7e06
--- /dev/null
@@ -0,0 +1,11 @@
+#!/bin/sh
+SUP="--suppressions=./cryptsetup-valg-supps"
+CHILD="--trace-children=yes --child-silent-after-fork=yes"
+MALLOC="--malloc-fill=aa"
+FREE="--free-fill=21"
+STACK="--max-stackframe=300000"
+EXTRAS="--read-var-info=yes --show-reachable=yes"
+LOGFILE="--log-file=./valglog.$(date +%s)_${INFOSTRING}"
+LEAKCHECK="--leak-check=full --track-origins=yes"
+
+exec valgrind  $SUP $GETSUP $CHILD $MALLOC $FREE $STACK $EXTRAS $LOGFILE  $LEAKCHECK "$@"