Bug#1031276: randomness on armel, armhf mipsel resulting in unreproducible man-db index.db files

Johannes Schauer Marin Rodrigues josch at debian.org
Tue Feb 14 13:09:31 GMT 2023


Source: gdbm
Version: 1.23-3
Severity: normal
User: reproducible-builds at lists.alioth.debian.org
Usertags: randomness
X-Debbugs-Cc: cjwatson at debian.org, reproducible-bugs at lists.alioth.debian.org
Control: affects -1 + mmdebstrap man-db

Hi,

here is a test script that shows the problem:

    $ printf "#:len=6\nZm9vYmFy\n#:len=6\nZm9vYmFy\n" > index.dump
    $ gdbm_load index.dump index1.db
    $ gdbm_load index.dump index2.db
    $ md5sum index1.db index2.db

The md5sums of index1.db and index2.db will differ despite both being created
from index.dump. To figure out which architectures are affected by this
problem, we use debvm:

    sshcmd="ssh -o NoHostAuthenticationForLocalhost=yes -p 8022 root at 127.0.0.1"
    failing=
    for arch in amd64 arm64 armel armhf i386 mips64el mipsel ppc64el s390x; do
    	debvm-create -a $arch -k ~/.ssh/id_rsa.pub -- --include=gdbmtool
    	debvm-run -s 8022 &
    	pid=$!
    	debvm-waitssh -t 300 127.0.0.1:8022
    	printf "#:len=6\nZm9vYmFy\n#:len=6\nZm9vYmFy\n" | $sshcmd tee /index.dump >/dev/null
    	$sshcmd gdbm_load /index.dump /index1.db
    	$sshcmd gdbm_load /index.dump /index2.db
    	ret=0
    	$sshcmd cmp /index1.db /index2.db || ret=1
    	if [ $ret -ne 0 ]; then
    		failing="$failing $arch"
    	fi
    	$sshcmd systemctl poweroff
    	wait $pid
    done
    echo $failing

This will output "armel armhf mipsel". Note, that qemu-usermode emulation is
not enough to reproduce the problem. So the following will show the issue when
run on arm64 but not when run on amd64:

    mmdebstrap --arch=armhf --variant=essential --include=gdbmtool \
        --customize-hook='printf "#:len=6\nZm9vYmFy\n#:len=6\nZm9vYmFy\n" > "$1/index.dump"' \
        --customize-hook='chroot "$1" gdbm_load /index.dump /index1.db' \
        --customize-hook='chroot "$1" gdbm_load /index.dump /index2.db' \
        --customize-hook='md5sum "$1/index1.db" "$1/index2.db"' \
        --customize-hook='cmp "$1/index1.db" "$1/index2.db"' \
        unstable /dev/null

I found this problem in an mmdebstrap autopkgtest failure due to different
contents of /var/cache/man/index.db on armel and armhf. When running gdbm_dump
for the two differing index.db files it shows that the contents they store is
actually identical. So this is a gdbm-specific problem and not a problem with
man-db.  I'm able to reproduce it by running gdbm_load on a minimal dump file
as shown above.

You can see the diffoscope output of the mmdebstrap test failure in this log:

https://ci.debian.net/data/autopkgtest/unstable/armhf/m/mmdebstrap/31327623/log.gz

grep for /index.db to find the differences.

Somebody familiar with the gdbm format can maybe spot which part of the file it
is that differs.

Thanks!

cheers, josch



More information about the Reproducible-bugs mailing list