diff options
Diffstat (limited to 'debian/tests/oversized-chunks')
-rwxr-xr-x | debian/tests/oversized-chunks | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/debian/tests/oversized-chunks b/debian/tests/oversized-chunks new file mode 100755 index 0000000..b610c42 --- /dev/null +++ b/debian/tests/oversized-chunks @@ -0,0 +1,73 @@ +#!/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 <andreas@fatal.se> +set -e +set -u +#set -x + +PACKAGES="util-linux bsdutils mount" +# 80k should be large enough to not trigger false positives. Bump this +# up if needed. Andreas committed this with 10k, and it was fine until +# July 2022 on arm* architectures. Suddenly an empty chunk of 56k size +# appeared in /bin/dmesg. In the interest of having util-linux migrate +# to testing, Chris has increased this limit and mailed the arm porters. +CHUNKSIZELIMIT="80000" + +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") + echo "I: file $FILE has empty chunk starting at $START sized $CHUNKSIZE" + 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 |