gpg sporadically fails with a fatal error accessing the random_seed file if
another gpg process accesses that file at the same time. Here's a Cygwin bash
script to reproduce the problem:
$ cat rungpg.sh
#!/bin/bash
i=0
while test $i -lt $1 ; do
echo test | '/c/Program Files (x86)/GNU/GnuPG-1/gpg.exe' --batch --yes
-c --passphrase-fd 0 -o NUL: NUL:
i=$(( $i + 1 ))
done
$ time (./rungpg.sh 10000 & ./rungpg.sh 10000 & ./rungpg.sh 10000 & ./rungpg.sh
10000 & wait)
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: fatal: 'C:/Dokumente und
Einstellungen/jechternach/Anwendungsdaten/GnuPG\random_seed' ist unlesbar: No
such file or directory
secmem usage: 2496/2496 bytes in 8/8 blocks of pool 2496/32768
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: fatal: 'C:/Dokumente und
Einstellungen/jechternach/Anwendungsdaten/GnuPG\random_seed' ist unlesbar: No
such file or directory
secmem usage: 2496/2496 bytes in 8/8 blocks of pool 2496/32768
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: fatal: 'C:/Dokumente und
Einstellungen/jechternach/Anwendungsdaten/GnuPG\random_seed' ist unlesbar: No
such file or directory
secmem usage: 2496/2496 bytes in 8/8 blocks of pool 2496/32768
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: fatal: 'C:/Dokumente und
Einstellungen/jechternach/Anwendungsdaten/GnuPG\random_seed' ist unlesbar: No
such file or directory
secmem usage: 2496/2496 bytes in 8/8 blocks of pool 2496/32768
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
gpg: Hinweis: 'random_seed'-Datei ist leer
real 23m0.147s
user 5m38.009s
sys 20m13.843s
$ '/c/Program Files (x86)/GNU/GnuPG-1/gpg.exe' --version
gpg (GnuPG) 1.4.12
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: C:/Dokumente und Einstellungen/jechternach/Anwendungsdaten/GnuPG
Unterstützte Verfahren:
Öff. Schlüssel: RSA, RSA-E, RSA-S, ELG-E, DSA
Verschlü.: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128,
CAMELLIA192, CAMELLIA256
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Komprimierung: nicht komprimiert, ZIP, ZLIB, BZIP2
This problem was fixed for Unix-like systems by adding file locking to
cipher/random.c, but file locking is also necessary on Windows. Maybe random.c
assumes that open() implicitly locks the file on Windows, but Process Monitor
shows that the random_seed file is opened with FILE_SHARE_READ |
FILE_SHARE_WRITE flags behind the scenes and these flags turn off implicit locking.
BTW, error handling in read_seed_file() after read() isn't quite right: Short
reads (caused by a truncated random_seed file) are treated like read errors. I
guess that this has caused the "No such file or directory" error messages shown
above because they look bogus -- the random_seed file should always be present
because update_random_seed_file() only truncates it but doesn't delete it.