Subject: | Repeated tie's to the same hash with no untie cause corruption |
Running on debian squeeze, the code below always fails around iteration
6 or 7 for me.
This is particularly nasty because it initially appears to work as
expected, but only fails semi-randomly with random stuff missing from
the DB. There's no warnings or anything else, you just suddenly end up
with what appears to be a corrupted database.
This was found when tracking down corruption bugs in spamassassin bayes
databases ("bayes: bayes db version 0 is not able to be used, aborting!")
Adding an untie in between fixes the problem, but it would be nice to
detect this case and either work properly, or generate some sort of
warning about how dangerous this is.
-----
use strict;
use warnings;
use DB_File;
my (%hash, %db);
my $fname = "/tmpfs/test.db";
unlink($fname);
for (1 .. 10000) {
print "iteration $_\n";
tie %db, 'DB_File', $fname, O_RDWR|O_CREAT, 0666;
for (1 .. 100) {
my $k = int rand(10000);
$db{$k} = $hash{$k} = int rand(10000);
}
# untie %db;
tie %db, 'DB_File', $fname, O_RDONLY, 0666;
my $nkeys = scalar keys %hash;
my $ndbkeys = scalar keys %db;
print "keys=$nkeys\n";
print "ndbkeys=$ndbkeys\n";
die "mismatch" if $nkeys != $ndbkeys;
}
-----
$ perldoc -m DB_File | grep 'VERSION ='
$VERSION = "1.820" ;
$VERSION = eval $VERSION; # needed for dev releases
$ perl -V
Summary of my perl5 (revision 5 version 10 subversion 1) configuration:
Platform:
osname=linux, osvers=2.6.32-5-amd64,
archname=x86_64-linux-gnu-thread-multi
uname='linux brahms 2.6.32-5-amd64 #1 smp sun sep 23 10:07:46 utc
2012 x86_64 gnulinux '
config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr
-Dprivlib=/usr/share/perl/5.10 -Darchlib=/usr/lib/perl/5.10
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl/5.10.1
-Dsitearch=/usr/local/lib/perl/5.10.1 -Dman1dir=/usr/share/man/man1
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1
-Dsiteman3dir=/usr/local/man/man3 -Dman1ext=1 -Dman3ext=3perl
-Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm -Uusesfio
-Uusenm -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib
-Dlibperl=libperl.so.5.10.1 -Dd_dosuid -des'
hint=recommended, useposix=true, d_sigaction=define
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=define, use64bitall=define, uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN
-fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
optimize='-O2 -g',
cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing
-pipe -fstack-protector -I/usr/local/include'
ccversion='', gccversion='4.4.5', gccosandvers=''
intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
libpth=/usr/local/lib /lib /usr/lib /lib64 /usr/lib64
libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
perllibs=-ldl -lm -lpthread -lc -lcrypt
libc=/lib/libc-2.11.3.so, so=so, useshrplib=true,
libperl=libperl.so.5.10.1
gnulibc_version='2.11.3'
Dynamic Linking:
dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib
-fstack-protector'
Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV
PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
USE_64_BIT_ALL
USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
USE_PERLIO USE_REENTRANT_API
Locally applied patches:
DEBPKG:debian/arm_thread_stress_timeout -
http://bugs.debian.org/501970 Raise the timeout of
ext/threads/shared/t/stress.t to accommodate slower build hosts
DEBPKG:debian/cpan_config_path - Set location of CPAN::Config to
/etc/perl as /usr may not be writable.
DEBPKG:debian/cpan_definstalldirs - Provide a sensible
INSTALLDIRS default for modules installed from CPAN.
DEBPKG:debian/db_file_ver - http://bugs.debian.org/340047 Remove
overly restrictive DB_File version check.
DEBPKG:debian/doc_info - Replace generic man(1) instructions
with Debian-specific information.
DEBPKG:debian/enc2xs_inc - http://bugs.debian.org/290336 Tweak
enc2xs to follow symlinks and ignore missing @INC directories.
DEBPKG:debian/errno_ver - http://bugs.debian.org/343351 Remove
Errno version check due to upgrade problems with long-running processes.
DEBPKG:debian/extutils_hacks - Various debian-specific ExtUtils
changes
DEBPKG:debian/fakeroot - Postpone LD_LIBRARY_PATH evaluation to
the binary targets.
DEBPKG:debian/instmodsh_doc - Debian policy doesn't install
.packlist files for core or vendor.
DEBPKG:debian/ld_run_path - Remove standard libs from
LD_RUN_PATH as per Debian policy.
DEBPKG:debian/libnet_config_path - Set location of libnet.cfg to
/etc/perl/Net as /usr may not be writable.
DEBPKG:debian/m68k_thread_stress - http://bugs.debian.org/495826
Disable some threads tests on m68k for now due to missing TLS.
DEBPKG:debian/mod_paths - Tweak @INC ordering for Debian
DEBPKG:debian/module_build_man_extensions -
http://bugs.debian.org/479460 Adjust Module::Build manual page
extensions for the Debian Perl policy
DEBPKG:debian/perl_synopsis - http://bugs.debian.org/278323
Rearrange perl.pod
DEBPKG:debian/prune_libs - http://bugs.debian.org/128355 Prune
the list of libraries wanted to what we actually need.
DEBPKG:debian/use_gdbm - Explicitly link against -lgdbm_compat
in ODBM_File/NDBM_File.
DEBPKG:fixes/assorted_docs - http://bugs.debian.org/443733
[384f06a] Math::BigInt::CalcEmu documentation grammar fix
DEBPKG:fixes/net_smtp_docs - http://bugs.debian.org/100195
[rt.cpan.org #36038] Document the Net::SMTP 'Port' option
DEBPKG:fixes/processPL - http://bugs.debian.org/357264
[rt.cpan.org #17224] Always use PERLRUNINST when building perl modules.
DEBPKG:debian/perlivp - http://bugs.debian.org/510895 Make
perlivp skip include directories in /usr/local
DEBPKG:fixes/pod2man-index-backslash -
http://bugs.debian.org/521256 Escape backslashes in .IX entries
DEBPKG:debian/disable-zlib-bundling - Disable zlib bundling in
Compress::Raw::Zlib
DEBPKG:fixes/kfreebsd_cppsymbols - http://bugs.debian.org/533098
[3b910a0] Add gcc predefined macros to $Config{cppsymbols} on GNU/kFreeBSD.
DEBPKG:debian/cpanplus_definstalldirs -
http://bugs.debian.org/533707 Configure CPANPLUS to use the site
directories by default.
DEBPKG:debian/cpanplus_config_path - Save local versions of
CPANPLUS::Config::System into /etc/perl.
DEBPKG:fixes/kfreebsd-filecopy-pipes -
http://bugs.debian.org/537555 [16f708c] Fix File::Copy::copy with pipes
on GNU/kFreeBSD
DEBPKG:fixes/anon-tmpfile-dir - http://bugs.debian.org/528544
[perl #66452] Honor TMPDIR when open()ing an anonymous temporary file
DEBPKG:fixes/abstract-sockets - http://bugs.debian.org/329291
[89904c0] Add support for Abstract namespace sockets.
DEBPKG:fixes/hurd_cppsymbols - http://bugs.debian.org/544307
[eeb92b7] Add gcc predefined macros to $Config{cppsymbols} on GNU/Hurd.
DEBPKG:fixes/autodie-flock - http://bugs.debian.org/543731 Allow
for flock returning EAGAIN instead of EWOULDBLOCK on linux/parisc
DEBPKG:fixes/archive-tar-instance-error -
http://bugs.debian.org/539355 [rt.cpan.org #48879] Separate Archive::Tar
instance error strings from each other
DEBPKG:fixes/positive-gpos - http://bugs.debian.org/545234 [perl
#69056] [c584a96] Fix \G crash on first match
DEBPKG:debian/devel-ppport-ia64-optim -
http://bugs.debian.org/548943 Work around an ICE on ia64
DEBPKG:fixes/trie-logic-match - http://bugs.debian.org/552291
[perl #69973] [0abd0d7] Fix a DoS in Unicode processing [CVE-2009-3626]
DEBPKG:fixes/hppa-thread-eagain - http://bugs.debian.org/554218
make the threads-shared test suite more robust, fixing failures on hppa
DEBPKG:fixes/crash-on-undefined-destroy -
http://bugs.debian.org/564074 [perl #71952] [1f15e67] Fix a NULL pointer
dereference when looking for a DESTROY method
DEBPKG:fixes/tainted-errno - http://bugs.debian.org/574129 [perl
#61976] [be1cf43] fix an errno stringification bug in taint mode
DEBPKG:fixes/safe-upgrade - http://bugs.debian.org/582978
Upgrade Safe.pm to 2.25, fixing CVE-2010-1974
DEBPKG:fixes/tell-crash - http://bugs.debian.org/578577
[f4817f3] Fix a tell() crash on bad arguments.
DEBPKG:fixes/format-write-crash - http://bugs.debian.org/579537
[perl #22977] [421f30e] Fix a crash in format/write
DEBPKG:fixes/arm-alignment - http://bugs.debian.org/289884
[f1c7503] Prevent gcc from optimizing the alignment test away on armel
DEBPKG:fixes/fcgi-test - Fix a failure in CGI/t/fast.t when FCGI
is installed
DEBPKG:fixes/hurd-ccflags - http://bugs.debian.org/587901 Make
hints/gnu.sh append to $ccflags rather than overriding them
DEBPKG:debian/squelch-locale-warnings -
http://bugs.debian.org/508764 Squelch locale warnings in Debian package
maintainer scripts
DEBPKG:fixes/lc-numeric-docs - http://bugs.debian.org/379329
[perl #78452] [903eb63] LC_NUMERIC documentation fixes
DEBPKG:fixes/lc-numeric-sprintf - http://bugs.debian.org/601549
[perl #78632] [b3fd614] Fix sprintf not to ignore LC_NUMERIC with constants
DEBPKG:fixes/concat-stack-corruption -
http://bugs.debian.org/596105 [perl #78674] [e3393f5] Fix stack pointer
corruption in pp_concat() with 'use encoding'
DEBPKG:fixes/cgi-multiline-header -
http://bugs.debian.org/606995 [CVE-2010-2761 CVE-2010-4410
CVE-2010-4411] CGI.pm MIME boundary and multiline header vulnerabilities
DEBPKG:fixes/casing-taint-cve-2011-1487 -
http://bugs.debian.org/622817 [perl #87336] fix unwanted taint
laundering in lc(), uc() et al.
DEBPKG:fixes/safe-reval-rdo-cve-2010-1447 - [PATCH] Wrap by
default coderefs returned by rdo and reval
DEBPKG:fixes/encode-heap-overflow - [PATCH] Fix decode_xs n-byte
heap-overflow security bug in
DEBPKG:fixes/digest_eval_hole - Close the eval "require $module"
security hole in
DEBPKG:fixes/unregister_signal_handler - [PATCH] main:
Unregister signal handler before destroying my_perl
DEBPKG:fixes/CVE-2012-5195 - avoid calling memset with a
negative count
DEBPKG:fixes/CVE-2012-5526 - [PATCH 1/4] CR escaping for P3P header
DEBPKG:fixes/storable-security-warning - [PATCH] add a note
about security concerns in Storable
DEBPKG:patchlevel - http://bugs.debian.org/567489 List packaged
patches for 5.10.1-17squeeze4 in patchlevel.h
Built under linux
Compiled at Dec 11 2012 16:58:53
%ENV:
PERL5LIB="/home/mod_perl/hm:/home/mod_perl/hm/modules"
@INC:
/home/mod_perl/hm
/home/mod_perl/hm/modules
/etc/perl
/usr/local/lib/perl/5.10.1
/usr/local/share/perl/5.10.1
/usr/lib/perl5
/usr/share/perl5
/usr/lib/perl/5.10
/usr/share/perl/5.10
/usr/local/lib/site_perl
.