1#!/bin/sh 2# Use Failmalloc to test behaviour in the face of out-of-memory conditions. 3# The test runs a binary multiple times while configuring Failmalloc to fail a 4# different malloc() call each time, while looking for abnormal program exits 5# due to segfaults. See https://www.nongnu.org/failmalloc/ 6# 7# Ideally, it would ensure that the test binary returns an error code on each 8# failure, but this often doesn't happen. This is a problem that should be 9# rectified, but the API doesn't allow returning an error code in many 10# functions that could encounter a problem. The issue could be solve in more 11# cases with more judicious use of log calls with EXIF_LOG_CODE_NO_MEMORY 12# codes. 13. ./check-vars.sh 14 15VERBOSE= 16if [ "$1" = "-v" ] ; then 17 VERBOSE=1 18fi 19 20if [ x"$FAILMALLOC_PATH" = x ]; then 21 echo libfailmalloc is not available 22 echo SKIPPING 23 exit 24fi 25 26BINARY_PREFIX=./ 27if [ -e .libs/lt-test-value ]; then 28 # If libtool is in use, the normal "binary" is actually a shell script which 29 # would be interfered with by libfailmalloc. Instead, use the special lt- 30 # binary which should work properly. 31 BINARY_PREFIX=".libs/lt-" 32fi 33 34# Usage: failmalloc_binary_test #iterations binary <optional arguments> 35# FIXME: auto-determine #iterations by comparing the output of each run 36# with the output of a normal run, and exiting when that happens. 37failmalloc_binary_test () { 38 binary="$BINARY_PREFIX$2" 39 iterations="$1" 40 shift 41 shift 42 echo Checking "$binary" for "$iterations" iterations 43 for n in $(seq "$iterations"); do 44 test "$VERBOSE" = 1 && { echo "$n"; set -x; } 45 FAILMALLOC_INTERVAL="$n" LD_PRELOAD="$FAILMALLOC_PATH" "$binary" "$@" >/dev/null 46 s=$? 47 test "$VERBOSE" = 1 && set +x; 48 if test "$s" -ge 128; then 49 # Such status codes only happen due to termination due to a signal 50 # like SIGSEGV. 51 echo "Abnormal binary exit status $s at malloc #$n on $binary" 52 echo FAILURE 53 exit 1 54 fi 55 done 56} 57 58# The number of iterations is determined empirically to be about twice as 59# high as the maximum number of mallocs performed by the test program in order 60# to avoid lowering code coverage in the case of future code changes that cause 61# more allocations. 62 63failmalloc_binary_test 500 test-value 64failmalloc_binary_test 300 test-mem 65for f in $SRCDIR/testdata/*jpg; do 66 echo "Testing `basename "$f"`" 67 failmalloc_binary_test 500 test-parse "$f" 68 # N.B., test-parse --swap-byte-order doesn't test any new paths 69done 70 71echo PASSED 72