SIGSEGV: PerlLoadModule inside VirtualHost with PerlOptions +Parent

Yuri Karaban <[email protected]>
Newsgroups gmane.comp.apache.mod-perl
Message-ID <[email protected]>
1. Problem Description:

Looks like mod_perl executes PerlLoadModule in a context of parent Perl
interpreter and module body is evaluated in parent Perl, but
Apache2::Module::add is switching the context again and in this context
TestParam module was not defined and gv_stashpv("TestParam", FALSE)
returns NULL (at modperl_module.c:764) and gv_fetchmethod_autoload is
executed with the NULL stash (at modperl_module.c:765).

2. Used Components and their Configuration:

*** mod_perl version 2.000008

*** using /usr/lib64/perl5/vendor_perl/5.18.2/x86_64-linux-thread-multi/Apache2/BuildConfig.pm

*** Makefile.PL options:
  MP_APR_LIB     => aprext
  MP_APXS        => /usr/sbin/apxs2
  MP_COMPAT_1X   => 1
  MP_DEBUG       => 1
  MP_GENERATE_XS => 1
  MP_LIBNAME     => mod_perl
  MP_TRACE       => 1
  MP_USE_DSO     => 1


*** The httpd binary was not found


*** (apr|apu)-config linking info

 -laprutil-1  -ldb-5.2 -lgdbm  -lexpat -L/var/tmp/portage/dev-libs/apr-util-1.5.3-r1/temp
 -lapr-1 -luuid -lrt -lcrypt  -lpthread -ldl



*** /usr/bin/perl -V
Summary of my perl5 (revision 5 version 18 subversion 2) configuration:

  Platform:
    osname=linux, osvers=3.13.6-gentoo, archname=x86_64-linux-thread-multi
    uname='linux localhost.localdomain 3.13.6-gentoo #1 smp preempt sat mar 29 21:30:07 eet 2014 x86_64'
    config_args='-des -Duseshrplib -Darchname=x86_64-linux-thread -Dcc=x86_64-pc-linux-gnu-gcc -Doptimize=-march=core2 -O2 -pipe -Dldflags=-Wl,-O1 -Wl,--as-needed -Dprefix=/usr -Dinstallprefix=/usr -Dsiteprefix=/usr/local -Dvendorprefix=/usr -Dscriptdir=/usr/bin -Dprivlib=/usr/lib64/perl5/5.18.2 -Darchlib=/usr/lib64/perl5/5.18.2/x86_64-linux-thread-multi -Dsitelib=/usr/local/lib64/perl5/5.18.2 -Dsitearch=/usr/local/lib64/perl5/5.18.2/x86_64-linux-thread-multi -Dvendorlib=/usr/lib64/perl5/vendor_perl/5.18.2 -Dvendorarch=/usr/lib64/perl5/vendor_perl/5.18.2/x86_64-linux-thread-multi -Dman1dir=/usr/share/man/man1 -Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 -Dsiteman3dir=/usr/local/man/man3 -Dvendorman1dir=/usr/share/man/man1 -Dvendorman3dir=/usr/share/man/man3 -Dman1ext=1 -Dman3ext=3pm -Dlibperl=libperl.so.5.18.2 -Dlocincpth=/usr/include  -Dglibpth=/lib64 /usr/lib64  -Duselargefiles -Dd_semctl_semun -Dcf_by=Gentoo -Dmyhostname=localhost -Dperladmin=root@localhost -Dinstallusrbinperl=n -Ud_csh -Uusenm -Di_ndbm -Di_gdbm -Di_db -Dusethreads -DDEBUGGING=none -Dinc_version_list=5.18.0/x86_64-linux-thread-multi 5.18.0 5.18.1/x86_64-linux-thread-multi 5.18.1  -Dlibpth=/usr/local/lib64 /lib64 /usr/lib64 -Dnoextensions=ODBM_File'
    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='x86_64-pc-linux-gnu-gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-march=core2 -O2 -pipe',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe'
    ccversion='', gccversion='4.8.2', 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='x86_64-pc-linux-gnu-gcc', ldflags ='-Wl,-O1 -Wl,--as-needed'
    libpth=/usr/local/lib64 /lib64 /usr/lib64
    libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc -lgdbm_compat
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=/lib/libc-2.18.so, so=so, useshrplib=true, libperl=libperl.so.5.18.2
    gnulibc_version='2.18'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -march=core2 -O2 -pipe -Wl,-O1 -Wl,--as-needed'


Characteristics of this binary (from libperl):
  Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS
                        PERL_DONT_CREATE_GVSV
                        PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
                        PERL_IMPLICIT_CONTEXT PERL_MALLOC_WRAP
                        PERL_PRESERVE_IVUV PERL_SAWAMPERSAND USE_64_BIT_ALL
                        USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
                        USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE
                        USE_LOCALE_NUMERIC USE_PERLIO USE_PERL_ATOF
                        USE_REENTRANT_API
  Locally applied patches:
	gentoo/EUMM-RUNPATH - https://bugs.gentoo.org/105054 cpan/ExtUtils-MakeMaker: drop $PORTAGE_TMPDIR from LD_RUN_PATH
	gentoo/EUMM_delete_packlist - Don't install .packlist or perllocal.pod for perl or vendor
	gentoo/config_over - Remove -rpath and append LDFLAGS to lddlflags
	gentoo/cpan_definstalldirs - Provide a sensible INSTALLDIRS default for modules installed from CPAN.
	gentoo/cpanplus_definstalldirs - Configure CPANPLUS to use the site directories by default.
	gentoo/create_libperl_soname - https://bugs.gentoo.org/286840 Set libperl soname
	gentoo/drop_fstack_protector - https://bugs.gentoo.org/348557 Don't force -fstack-protector on everyone.
	gentoo/enc2xs - Tweak enc2xs to follow symlinks and ignore missing @INC directories.
	gentoo/mod_paths - Add /etc/perl to @INC
	gentoo/patchlevel - List packaged patches for perl-5.18.2(#1) in patchlevel.h
	gentoo/aix_soname - aix gcc detection and shared library soname support
	gentoo/opensolars_headers - Add headers for opensolaris
	gentoo/cleanup-paths - Cleanup PATH and shrpenv
	gentoo/usr_local - Remove /usr/local paths
	gentoo/hints_hpux - Fix hpux hints
	gentoo/darwin-cc-ld - https://bugs.gentoo.org/297751 darwin: Use $CC to link
	gentoo/interix - Fix interix hints
	fixes/net_smtp_docs - [rt.cpan.org #36038] Document the Net::SMTP 'Port' option
	debian/cpan-missing-site-dirs - Fix CPAN::FirstTime defaults with nonexisting site dirs if a parent is writable
	fixes/memoize_storable_nstore - [rt.cpan.org #77790] Memoize::Storable: respect 'nstore' option not respected
	fixes/net_ftp_failed_command - [rt.cpan.org #37700] Net::FTP: cope gracefully with a failed command
	fixes/perlbug-patchlist - [3541c11] [perl #118433] Make perlbug look up the list of local patches at run time
	fixes/module_metadata_taint_fix - [bff978f] [rt.cpan.org #88576] untaint version, if needed, in Module::Metadata
	fixes/IPC-SysV-spelling - [rt.cpan.org #86736] Fix spelling of IPC_CREAT in IPC-SysV documentation
  Built under linux
  Compiled at Apr  5 2014 18:55:03
  %ENV:
    PERL_LWP_USE_HTTP_10="1"
  @INC:
    /etc/perl
    /usr/local/lib64/perl5/5.18.2/x86_64-linux-thread-multi
    /usr/local/lib64/perl5/5.18.2
    /usr/lib64/perl5/vendor_perl/5.18.2/x86_64-linux-thread-multi
    /usr/lib64/perl5/vendor_perl/5.18.2
    /usr/local/lib64/perl5
    /usr/lib64/perl5/vendor_perl
    /usr/lib64/perl5/5.18.2/x86_64-linux-thread-multi
    /usr/lib64/perl5/5.18.2
    .

*** Packages of interest status:

Apache2            : -
Apache2::Request   : -
CGI                : 3.63, 3.63
ExtUtils::MakeMaker: 6.66, 6.82
LWP                : 6.05
mod_perl           : -
mod_perl2          : 2.000008


3. This is the core dump trace: (if you get a core dump):

#0  0x00007ffff0dd465a in Perl_gv_fetchmethod_pvn_flags ()
   from /usr/lib64/libperl.so.5.18
#1  0x00007ffff11457af in modperl_module_fetch_method (my_perl=0x7492c0,
    p=0x67e138, modp=0x744d78, method=0x7ffff1154763 "DIR_CREATE")
    at modperl_module.c:765
#2  0x00007ffff11459d6 in modperl_module_add (p=0x67e138, s=0x688418,
    name=0x946eb0 "TestParam", mod_cmds=0x94b830) at modperl_module.c:816
#3  0x00007fffede89101 in mpxs_Apache2__Module_add (my_perl=0x844970,
    package=0x946eb0 "TestParam", cmds=0x94b830)
    at /var/tmp/portage/www-apache/mod_perl-2.0.8/work/mod_perl-2.0.8/xs/Apache2/Module/Apache2__Module.h:90
#4  0x00007fffede895ca in XS_Apache2__Module_add (my_perl=0x844970,
    cv=0x9de6e0) at Module.xs:55
#5  0x00007ffff0e412e6 in Perl_pp_entersub () from /usr/lib64/libperl.so.5.18
#6  0x00007ffff0e39936 in Perl_runops_standard ()
   from /usr/lib64/libperl.so.5.18
#7  0x00007ffff0dcbb4b in Perl_eval_sv () from /usr/lib64/libperl.so.5.18
#8  0x00007ffff11312d3 in modperl_require_module (my_perl=0x844970,
    pv=0x72d730 "TestParam", logfailure=0) at modperl_util.c:30
#9  0x00007ffff11299a0 in modperl_cmd_modules (parms=0x7fffffffdb70,
    mconfig=0x743e78, arg=0x72d730 "TestParam") at modperl_cmd.c:190
#10 0x00007ffff112c131 in modperl_cmd_load_module (parms=0x7fffffffdb70,
    mconfig=0x743e78, arg=0x72d730 "TestParam") at modperl_cmd.c:668
#11 0x0000000000440886 in invoke_cmd (cmd=0x7ffff135d678 <modperl_cmds+760>,
    parms=0x7fffffffdb70, mconfig=0x743e78, args=0x72d730 "TestParam")
    at config.c:757
#12 0x0000000000441bc4 in ap_walk_config_sub (current=0x72d6f0,
    parms=0x7fffffffdb70, section_vector=0x743800) at config.c:1163
#13 0x0000000000441c71 in ap_walk_config (current=0x72d6f0,
    parms=0x7fffffffdb70, section_vector=0x743800) at config.c:1196
#14 0x0000000000435014 in virtualhost_section (cmd=0x7fffffffdb70,
    dummy=0x689b60, arg=0x7430d0 "127.0.0.1:8000") at core.c:2234
#15 0x0000000000440886 in invoke_cmd (cmd=0x460510 <core_cmds+80>,
    parms=0x7fffffffdb70, mconfig=0x689b60, args=0x72d618 "127.0.0.1:8000>")
    at config.c:757
#16 0x0000000000441bc4 in ap_walk_config_sub (current=0x72d5d8,
    parms=0x7fffffffdb70, section_vector=0x689740) at config.c:1163
#17 0x0000000000441c71 in ap_walk_config (current=0x72d5d8,
    parms=0x7fffffffdb70, section_vector=0x689740) at config.c:1196
#18 0x0000000000442fc3 in ap_process_config_tree (s=0x688418,
    conftree=0x6ada78, p=0x67e138, ptemp=0x68a198) at config.c:1765
#19 0x0000000000425252 in main (argc=3, argv=0x7fffffffdda8) at main.c:645

4. This is the Apache config file:

Listen 127.0.0.1:8000

<VirtualHost 127.0.0.1:8000>
	PerlOptions +Parent
	PerlSwitches -I/path/to/module
	PerlLoadModule TestParam

	CustomLog /tmp/access.log combined
	ErrorLog /tmp/error.log
</VirtualHost>

5. This is the Perl module:

package TestParam;

use strict;
use warnings;

use Apache2::Module ();

my @directives = ({ name => 'TestParam' });

Apache2::Module::add(__PACKAGE__, \@directives);

1;

This report was generated by /usr/bin/mp2bug on Mon Apr 14 11:39:36 2014 GMT.

-- 
E pluribus unum
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.