#!/bin/bash # # This test was written in response to http://bugs.debian.org/785075 to # attempt to automatically catch when/if it happens again. # It seems something in the build toolchain is sometimes producing lots # of embedded zeroes in the executables. # For example in util-linux 2.26.2-2 the /sbin/fstrim was over 2MB in size # instead of normal ~ 40kB. # # Copyright (c) 2015, Andreas Henriksson set -e set -u #set -x PACKAGES="util-linux bsdutils mount" # 10k should be large enough to not trigger false positives. Bump this # up if needed. CHUNKSIZELIMIT="10000" CURRENT="" LAST="" RET=0 for FILE in $(dpkg -L $PACKAGES | egrep '/s?bin/') ; do if [ ! -e "$FILE" ]; then #echo "E: target file '$FILE' not found." >&2 exit 1 fi function chunk_size { #echo "DEBUG: start => $1, stop => $2" >&2 SIZE=$(echo ibase=16 \; ${2^^} - ${1^^} | bc) #echo "I: Calculated chunk size $SIZE ($2 - $1)" >&2 echo $SIZE } hd $FILE | grep -C1 '^\*' | while read -a CURRENT do if [ "${CURRENT[0]}" = "--" ]; then #echo "I: Skipping separator" >&2 continue fi if [ "${CURRENT[0]}" = "*" ]; then #echo "I: Found chunk indicator." >&2 START="$LAST" fi if [ "$LAST" = "*" ]; then #echo "I: Both start and stop should now be located." >&2 STOP="${CURRENT[0]}" CHUNKSIZE=$(chunk_size "$START" "$STOP") if [ "$CHUNKSIZE" -gt "$CHUNKSIZELIMIT" ]; then echo "E: oversized chunk found in $FILE !" ((RET++)) fi fi #echo "I: Yet another line processed." >&2 LAST="${CURRENT[0]}" done done exit $RET