Skip Menu |

This queue is for tickets about the DBD-SQLite CPAN distribution.

Report information
The Basics
Id: 70135
Status: resolved
Priority: 0/
Queue: DBD-SQLite

People
Owner: Nobody in particular
Requestors: siracusa [...] gmail.com
Cc:
AdminCc:

Bug Information
Severity: Critical
Broken in: 1.33
Fixed in: (no value)



Subject: All operations fail with "not an error" when APR::Table is loaded
There are several mod_perl-related "not an error" bugs reported. This may be related to, and perhaps a minimal reproduction of them. Simply loading the APR::Table module causes DBD::SQLite 1.33 (and possibly earlier versions) to fail all attempted operations with a "not an error" error on CentOS 5.4 and perl 5.8.8. Reproduction script: --- #!/usr/bin/perl use strict; use DBI; use APR::Table; # XXX: comment out this line and the code below works my $dbh = DBI->connect('dbi:SQLite:dbname=my.db', '', '', { RaiseError => 1 }) or die $DBI::errstr; $dbh->do('SELECT 1'); $dbh->disconnect; print "OK\n"; --- Expected output: OK Actual output: DBD::SQLite::db do failed: not an error at sqlite.pl line 10. DBD::SQLite::db do failed: not an error at sqlite.pl line 10. System information: % uname -a Linux xxx.com 2.6.18-238.1.1.el5 #1 SMP Tue Jan 4 13:32:19 EST 2011 x86_64 x86_64 x86_64 GNU/Linux % perl -V Summary of my perl5 (revision 5 version 8 subversion 8) configuration: Platform: osname=linux, osvers=2.6.18-53.el5, archname=x86_64-linux-thread-multi uname='linux builder10.centos.org 2.6.18-53.el5 #1 smp mon nov 12 02:14:55 est 2007 x86_64 x86_64 x86_64 gnulinux ' config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack- protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Dversion=5.8.8 -Dmyhostname=localhost - Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr - Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Dprivlib=/usr/lib/perl5/5.8.8 - Dsitelib=/usr/lib/perl5/site_perl/5.8.8 -Dvendorlib=/usr/lib/perl5/vendor_perl/5.8.8 - Darchlib=/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi - Dsitearch=/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi - Dvendorarch=/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi -Darchname=x86_64-linux- thread-multi -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm - Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr - Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto - Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dinc_version_list=5.8.7 5.8.6 5.8.5 - Dscriptdir=/usr/bin' hint=recommended, useposix=true, d_sigaction=define usethreads=define use5005threads=undef 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='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm', optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp- buffer-size=4 -m64 -mtune=generic', cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement - I/usr/local/include -I/usr/include/gdbm' ccversion='', gccversion='4.1.2 20080704 (Red Hat 4.1.2-46)', 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='gcc', ldflags ='' libpth=/usr/local/lib64 /lib64 /usr/lib64 libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc libc=, so=so, useshrplib=true, libperl=libperl.so gnulibc_version='2.5' Dynamic Linking: dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,- rpath,/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE' cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack- protector --param=ssp-buffer-size=4 -m64 -mtune=generic' Characteristics of this binary (from libperl): Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_PERLIO USE_REENTRANT_API Built under linux Compiled at Sep 3 2009 10:26:51 %ENV: PERL_READLINE_NOWARN="" PERL_RL=" o=0" @INC: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .
More information on where APR::Table comes from: % pmpath APR::Table /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/APR/Table.pm % pmvers APR::Table 0.009000 % rpm -qf /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/APR/Table.pm mod_perl-2.0.4-6.el5 % rpm -qi mod_perl-2.0.4-6.el5 Name : mod_perl Relocations: (not relocatable) Version : 2.0.4 Vendor: CentOS Release : 6.el5 Build Date: Wed 21 Jan 2009 01:22:44 AM EST Install Date: Fri 28 May 2010 03:20:33 PM EDT Build Host: builder10.centos.org Group : System Environment/Daemons Source RPM: mod_perl-2.0.4-6.el5.src.rpm Size : 7085550 License: ASL 2.0 Signature : DSA/SHA1, Tue 17 Mar 2009 07:35:59 AM EDT, Key ID a8a447dce8562897 URL : http://perl.apache.org/ Summary : An embedded Perl interpreter for the Apache Web server Description : Mod_perl incorporates a Perl interpreter into the Apache web server, so that the Apache web server can directly execute Perl code. Mod_perl links the Perl runtime library into the Apache web server and provides an object-oriented Perl interface for Apache's C language API. The end result is a quicker CGI script turnaround process, since no external Perl interpreter has to be started. Install mod_perl if you're installing the Apache web server and you'd like for it to directly incorporate a Perl interpreter.
When APR::Table is NOT loaded and the test script (see above) is run, the sqlite3_open() function resolves to the one defined in the sqlite3.c file in the DBD::SQLite distribution, and the code works: --- dev [DBD-SQLite-1.33]% gdb --args /usr/bin/perl -I blib/lib -I blib/arch -I blib/lib/auto sqlite.pl ... 88 rc = sqlite3_open(dbname, db); (gdb) stepi 0x00002b591b114fd3 88 rc = sqlite3_open(dbname, db); (gdb) 0x00002b591b114fd6 88 rc = sqlite3_open(dbname, db); (gdb) 0x00002b591b107030 in sqlite3_open@plt () from blib/arch/auto/DBD/SQLite/SQLite.so (gdb) sqlite3_open (zFilename=0x8f94dc0 "my.db", ppDb=0x8f93508) at sqlite3.c:109185 109185 ){ (gdb) --- When APR::Table IS loaded, the sqlite3_open() function resolves to the one defined in the system-wide SQLIte library /usr/lib64/libsqlite3.so.0 --- dev [DBD-SQLite-1.33]% gdb --args /usr/bin/perl -I blib/lib -I blib/arch -I blib/lib/auto sqlite.pl ... 88 rc = sqlite3_open(dbname, db); (gdb) stepi 0x00002b5c593f6fd3 88 rc = sqlite3_open(dbname, db); (gdb) 0x00002b5c593f6fd6 88 rc = sqlite3_open(dbname, db); (gdb) 0x00002b5c593e9030 in sqlite3_open@plt () from blib/arch/auto/DBD/SQLite/SQLite.so (gdb) 0x0000003098e28750 in sqlite3_open () from /usr/lib64/libsqlite3.so.0 (gdb) --- Later, this causes db->magic to be 0 instead of SQLITE_MAGIC_OPEN, and the call to sqlite3SafetyCheckOk() from sqlite3LockAndPrepare() returns false, causing SQLITE_MISUSE_BKPT to be returned. Loading APR::Table by itself causes this file to be loaded: /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/auto/APR/APR.so APR.so apparently links to the system-installed SQLite library: % ldd /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/auto/APR/APR.so | grep sql libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x00002ac50224b000) This seems to explain why, when APR::Table is loaded, the sqlite3_open() function resolves to the one in /usr/lib64/libsqlite3.so.0 and not the one in DBD::SQLite's sqlite3.c file. I haven't figured out how to stop this from happening, nor do I understand why APR.so links to /usr/lib64/libsqlite3.so.0 (I don't see any references to SQLite in the mod_perl code). I just wanted to add some more information.
I have experienced similar issues with symbol resolution in a different module and found that you force resolution to the symbols within your own shared module / code definitions by using the ld option '-Bsymbolic' (option to gcc /g++ therefore is '-Wl,-Bsymbolic'.) The attached patch adds the necessary changes to Makefile.PL of DBD- SQLite-1.33. It may be worth giving this a try and seeing if it solves your issue. Regards Mark On Tue Aug 09 16:28:14 2011, JSIRACUSA wrote: Show quoted text
> When APR::Table is NOT loaded and the test script (see above) is run, > the sqlite3_open() > function resolves to the one defined in the sqlite3.c file in the > DBD::SQLite distribution, and > the code works:
Subject: symbolic.patch
--- Makefile.PL 2011-09-15 16:00:20.282300000 +0100 +++ Makefile.PL 2011-09-15 16:02:27.235100000 +0100 @@ -242,6 +242,9 @@ ( @CC_LIBS ? ( LIBS => join( ' ', @CC_LIBS ) ) : () ), + CCFLAGS => $Config{ccflags} . ' -Wl,-Bsymbolic', + LDFLAGS => $Config{ldflags} . ' -Wl,-Bsymbolic', + LDDLFLAGS => $Config{lddlflags} . ' -Wl,-Bsymbolic', ); #####################################################################
Works great for me. Applied in the trunk with a slight modification (to exclude MSVC). Thanks! Kenichi On Fri Sep 16 00:22:12 2011, MDOOTSON wrote: Show quoted text
> I have experienced similar issues with symbol resolution in a
different Show quoted text
> module and found that you force resolution to the symbols within your > own shared module / code definitions by using the ld option '-
Bsymbolic' Show quoted text
> (option to gcc /g++ therefore is '-Wl,-Bsymbolic'.) > > The attached patch adds the necessary changes to Makefile.PL of DBD- > SQLite-1.33. > > It may be worth giving this a try and seeing if it solves your issue. > > Regards > > Mark > > > On Tue Aug 09 16:28:14 2011, JSIRACUSA wrote:
> > When APR::Table is NOT loaded and the test script (see above) is
run, Show quoted text
> > the sqlite3_open() > > function resolves to the one defined in the sqlite3.c file in the > > DBD::SQLite distribution, and > > the code works:
> >
Closing this ticket as DBD::SQLite 1.34_01 with this fix is out. If you still experience the problem, please reopen this. Thanks.
On Wed Sep 21 22:44:35 2011, ISHIGAKI wrote: Show quoted text
> Closing this ticket as DBD::SQLite 1.34_01 with this fix is out. If you > still experience the problem, please reopen this. Thanks.
The fix in Makefile.PL looks suspicious. You match $Config::Config{cc} =~ /^g?cc/ but you should do instead: if ($Config::Config{ccname} eq 'gcc') { ... } gcc is an alias for cc, not the other way round. Besides, the variable 'cc' often contains gcc's full name including the architecture. For example on Gentoo Linux it is something like "x86_64-pc-linux-gnu-gcc" and the fix is not applied although it should. But using ccname may still fail on systems where you use gcc with a native (non-GNU) linker. I'm not sure whether gcc will then silently ignore that option or the linker will bail out with an error. Since the option is not portable, it is probably best to compile and link some test code instead of guessing.
Hopefully this is fixed in 1.35 (actually 1.34_01/02). If you still suffer from this issue, please reopen this. Thanks. On Mon Aug 08 23:12:52 2011, JSIRACUSA wrote: Show quoted text
> There are several mod_perl-related "not an error" bugs reported. This > may be related to, and perhaps a minimal > reproduction of them. Simply loading the APR::Table module causes > DBD::SQLite 1.33 (and possibly earlier > versions) to fail all attempted operations with a "not an error" error > on CentOS 5.4 and perl 5.8.8. Reproduction > script: > > --- > > #!/usr/bin/perl > > use strict; > > use DBI; > > use APR::Table; # XXX: comment out this line and the code below works > > my $dbh = DBI->connect('dbi:SQLite:dbname=my.db', '', '', { RaiseError > => 1 }) or die $DBI::errstr; > $dbh->do('SELECT 1'); > $dbh->disconnect; > > print "OK\n"; > > --- > > Expected output: OK > > Actual output: > > DBD::SQLite::db do failed: not an error at sqlite.pl line 10. > DBD::SQLite::db do failed: not an error at sqlite.pl line 10. > > System information: > > % uname -a > Linux xxx.com 2.6.18-238.1.1.el5 #1 SMP Tue Jan 4 13:32:19 EST 2011 > x86_64 x86_64 x86_64 GNU/Linux > > % perl -V > > Summary of my perl5 (revision 5 version 8 subversion 8) configuration: > Platform: > osname=linux, osvers=2.6.18-53.el5, archname=x86_64-linux-thread- > multi > uname='linux builder10.centos.org 2.6.18-53.el5 #1 smp mon nov 12 > 02:14:55 est 2007 x86_64 x86_64 > x86_64 gnulinux ' > config_args='-des -Doptimize=-O2 -g -pipe -Wall > -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack- > protector --param=ssp-buffer-size=4 -m64 -mtune=generic > -Dversion=5.8.8 -Dmyhostname=localhost - > Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. > -Dinstallprefix=/usr -Dprefix=/usr - > Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 > -Dprivlib=/usr/lib/perl5/5.8.8 - > Dsitelib=/usr/lib/perl5/site_perl/5.8.8 > -Dvendorlib=/usr/lib/perl5/vendor_perl/5.8.8 - > Darchlib=/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi - > Dsitearch=/usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi - > Dvendorarch=/usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread- > multi -Darchname=x86_64-linux- > thread-multi -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib > -Dusethreads -Duseithreads -Duselargefiles > -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow > -Di_syslog -Dman3ext=3pm - > Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly > -Dpager=/usr/bin/less -isr - > Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto > -Ud_endprotoent_r_proto - > Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto > -Dinc_version_list=5.8.7 5.8.6 5.8.5 - > Dscriptdir=/usr/bin' > hint=recommended, useposix=true, d_sigaction=define > usethreads=define use5005threads=undef 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='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE > -fno-strict-aliasing -pipe -Wdeclaration-after-statement > -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 > -I/usr/include/gdbm', > optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions > -fstack-protector --param=ssp- > buffer-size=4 -m64 -mtune=generic', > cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe > -Wdeclaration-after-statement - > I/usr/local/include -I/usr/include/gdbm' > ccversion='', gccversion='4.1.2 20080704 (Red Hat 4.1.2-46)', > 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='gcc', ldflags ='' > libpth=/usr/local/lib64 /lib64 /usr/lib64 > libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread > -lc > perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc > libc=, so=so, useshrplib=true, libperl=libperl.so > gnulibc_version='2.5' > Dynamic Linking: > dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E > -Wl,- > rpath,/usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi/CORE' > cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall > -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack- > protector --param=ssp-buffer-size=4 -m64 -mtune=generic' > > > Characteristics of this binary (from libperl): > Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT > PERL_MALLOC_WRAP USE_64_BIT_ALL USE_64_BIT_INT > USE_ITHREADS USE_LARGE_FILES USE_PERLIO > USE_REENTRANT_API > Built under linux > Compiled at Sep 3 2009 10:26:51 > %ENV: > PERL_READLINE_NOWARN="" > PERL_RL=" o=0" > @INC: > /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi > /usr/lib/perl5/site_perl/5.8.8 > /usr/lib/perl5/site_perl > /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi > /usr/lib/perl5/vendor_perl/5.8.8 > /usr/lib/perl5/vendor_perl > /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi > /usr/lib/perl5/5.8.8 > .