Add memcheck support to compat.sh
diff --git a/tests/compat.sh b/tests/compat.sh
index db24d7c..1107b71 100755
--- a/tests/compat.sh
+++ b/tests/compat.sh
@@ -3,9 +3,12 @@
# Test interop with OpenSSL for each common ciphersuite and version.
# Also test selfop for ciphersuites not shared with OpenSSL.
+set -u
+
let "tests = 0"
let "failed = 0"
let "skipped = 0"
+let "srvmem = 0"
# default values, can be overriden by the environment
: ${P_SRV:=../programs/ssl/ssl_server2}
@@ -17,6 +20,7 @@
TYPES="ECDSA RSA PSK"
FILTER=""
VERBOSE=""
+MEMCHECK=0
print_usage() {
echo "Usage: $0"
@@ -25,6 +29,7 @@
echo -e " -m|--modes\tWhich modes to perform (Default: \"ssl3 tls1 tls1_1 tls1_2\")"
echo -e " -t|--types\tWhich key exchange type to perform (Default: \"ECDSA RSA PSK\")"
echo -e " -V|--verify\tWhich verification modes to perform (Default: \"NO YES\")"
+ echo -e " -M, --memcheck\tCheck memory leaks and errors."
echo -e " -v|--verbose\t\tSet verbose output."
}
@@ -46,6 +51,9 @@
-v|--verbose)
VERBOSE=1
;;
+ -M|--memcheck)
+ MEMCHECK=1
+ ;;
-h|--help)
print_usage
exit 0
@@ -455,6 +463,22 @@
esac
}
+# is_polar <cmd_line>
+is_polar() {
+ echo "$1" | grep 'ssl_server2\|ssl_client2' > /dev/null
+}
+
+# has_mem_err <log_file_name>
+has_mem_err() {
+ if ( grep -F 'All heap blocks were freed -- no leaks are possible' "$1" &&
+ grep -F 'ERROR SUMMARY: 0 errors from 0 contexts' "$1" ) > /dev/null
+ then
+ return 1 # false: does not have errors
+ else
+ return 0 # true: has errors
+ fi
+}
+
# start_server <name>
# also saves name and command
start_server() {
@@ -464,6 +488,9 @@
;;
[Pp]olar*)
SERVER_CMD="$P_SRV $P_SERVER_ARGS"
+ if [ "$MEMCHECK" -gt 0 ]; then
+ SERVER_CMD="valgrind --leak-check=full $SERVER_CMD"
+ fi
;;
*)
echo "error: invalid server name: $1" >&2
@@ -494,6 +521,15 @@
esac
wait $PROCESS_ID 2>/dev/null
+
+ if [ "$MEMCHECK" -gt 0 ]; then
+ if is_polar "$SERVER_CMD" && has_mem_err srv_out; then
+ echo " ! Server had memory errors"
+ let "srvmem++"
+ return
+ fi
+ fi
+
rm -f srv_out
}
@@ -536,8 +572,11 @@
[Pp]olar*)
CLIENT_CMD="$P_CLI $P_CLIENT_ARGS force_ciphersuite=$2"
+ if [ "$MEMCHECK" -gt 0 ]; then
+ CLIENT_CMD="valgrind --leak-check=full $CLIENT_CMD"
+ fi
log "$CLIENT_CMD"
- $CLIENT_CMD > cli_out
+ $CLIENT_CMD > cli_out 2>&1
EXIT=$?
case $EXIT in
@@ -545,6 +584,13 @@
"2") RESULT=1 ;;
*) RESULT=2 ;;
esac
+
+ if [ "$MEMCHECK" -gt 0 ]; then
+ if is_polar "$CLIENT_CMD" && has_mem_err cli_out; then
+ RESULT=2
+ fi
+ fi
+
;;
*)
@@ -566,8 +612,9 @@
echo FAIL
echo " ! $SERVER_CMD"
echo " ! $CLIENT_CMD"
- echo -n " ! end of client output: "
- tail -n5 cli_out
+ cp srv_out c-srv-${tests}.log
+ cp cli_out c-cli-${tests}.log
+ echo " ! outputs saved to c-srv-${tests}.log, c-cli-${tests}.log"
let "failed++"
;;
esac
@@ -637,7 +684,7 @@
echo "------------------------------------------------------------------------"
-if (( failed != 0 ));
+if (( failed != 0 && srvmem != 0 ));
then
echo -n "FAILED"
else
@@ -645,6 +692,7 @@
fi
let "passed = tests - failed"
-echo " ($passed / $tests tests ($skipped skipped))"
+echo " ($passed / $tests tests ($skipped skipped, $srvmem server memory errors)"
+let "failed += srvmem"
exit $failed
diff --git a/tests/ssl-opt.sh b/tests/ssl-opt.sh
index 72b7401..6950ec3 100755
--- a/tests/ssl-opt.sh
+++ b/tests/ssl-opt.sh
@@ -63,11 +63,11 @@
# fail <message>
fail() {
echo "FAIL"
- echo " $1"
+ echo " ! $1"
- cp srv_out srv-${TESTS}.log
- cp cli_out cli-${TESTS}.log
- echo " outputs saved to srv-${TESTS}.log and cli-${TESTS}.log"
+ cp srv_out o-srv-${TESTS}.log
+ cp cli_out o-cli-${TESTS}.log
+ echo " ! outputs saved to o-srv-${TESTS}.log and o-cli-${TESTS}.log"
FAILS=`echo $FAILS + 1 | bc`
}