[PATCH] Apache2::SizeLimit aborts when smaps is not available

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

  Apache2::SizeLimit aborts when smaps facility is unavailable. Here's the
error from the error log:

Linux::Smaps: Cannot open /proc/9700/smaps: No such file or directory
BEGIN failed--compilation aborted at
/data/wre/prereqs/lib/perl5/site_perl/5.10.0/i686-linux/Apache2/SizeLimit.pm
line 98

This installation is part of WebGUI CMS (hence the path, starting with
/data/wre),
but there's nothing specific to WebGUI here - it's just a plain mod_perl
file tree.

The error is not caused by insufficient read permissions - there are
simply no smaps files in /proc/xxx.
Apache2::SizeLimit documentation mentions two possible solutions:

   1. Installing an OS patch with smaps support (which may or may not be an
option)

   2. Setting $Apache2::SizeLimit::USE_SMAPS to 0 before the first check.
This doesn't
      help in this particular case, because the error is generated within
the BEGIN block;
      besides, the chunk of code which produces this error, pays no
attention to $USE_SMAPS


I believe the error is caused simply by placing the wrong (or rather
insufficient) statement inside eval() :

        if ( eval { require Linux::Smaps } and Linux::Smaps->new($$) ) {
             ...
        }

Linux::Smaps module is present, and obviously returns 1, but
Linux::Smaps->new throws an error
which is not being caught by eval.

I propose the following trivial patch:


--------------------------8<--------------------

*** ./SizeLimit.pm      2009-11-30 09:13:16.000000000 -0600
--- /tmp/SizeLimit.pm.orig      2009-11-30 09:24:04.000000000 -0600
***************
*** 58,64 ****

      }
      elsif (LINUX) {
!         if ( eval { require Linux::Smaps and Linux::Smaps->new($$) } ) {
              $HOW_BIG_IS_IT = \&linux_smaps_size_check_first_time;
          }
          else {
--- 58,64 ----

      }
      elsif (LINUX) {
!         if ( eval { require Linux::Smaps } and Linux::Smaps->new($$) ) {
              $HOW_BIG_IS_IT = \&linux_smaps_size_check_first_time;
          }
          else {

--------------------------8<--------------------


-- Harry Danilevsky

[email protected]


2. Used Components and their Configuration:

*** mod_perl version 2.000004

*** using
/data/wre/prereqs/lib/perl5/site_perl/5.10.0/i686-linux/Apache2/BuildConfig.pm

*** Makefile.PL options:
  MP_APR_LIB     => aprext
  MP_APXS        => /data/wre/prereqs/bin/apxs
  MP_COMPAT_1X   => 1
  MP_GENERATE_XS => 1
  MP_LIBNAME     => mod_perl
  MP_USE_DSO     => 1


*** The httpd binary was not found


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

 -L/data/wre/prereqs/lib -laprutil-1  -lexpat
 -L/data/wre/prereqs/lib -lapr-1 -lrt -lcrypt  -lpthread -ldl



*** /data/wre/prereqs/bin/perl -V
Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
  Platform:
    osname=linux, osvers=2.4.21-51.el, archname=i686-linux
    uname='linux centos3 2.4.21-51.el #1 thu aug 16 17:03:59 edt 2007 i686
i686 i386 gnulinux '
    config_args='-Dprefix=/data/wre/prereqs -des'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=undef, usemultiplicity=undef
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-fno-strict-aliasing -pipe -I/usr/local/include
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-fno-strict-aliasing -pipe -I/usr/local/include'
    ccversion='', gccversion='3.2.3 20030502 (Red Hat Linux 3.2.3-59)',
gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -ldl -lm -lcrypt -lutil -lc
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lc
    libc=/lib/libc-2.3.2.so, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.3.2'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib'


Characteristics of this binary (from libperl):
  Compile-time options: PERL_DONT_CREATE_GVSV PERL_MALLOC_WRAP
                        USE_LARGE_FILES USE_PERLIO
  Built under linux
  Compiled at May 27 2009 20:31:04
  %ENV:
    PERL_LWP_USE_HTTP_10="1"
  @INC:
    /data/wre/prereqs/lib/perl5/5.10.0/i686-linux
    /data/wre/prereqs/lib/perl5/5.10.0
    /data/wre/prereqs/lib/perl5/site_perl/5.10.0/i686-linux
    /data/wre/prereqs/lib/perl5/site_perl/5.10.0
    .

*** Packages of interest status:

Apache2            : -
Apache2::Request   : 2.08
CGI                : 3.42
ExtUtils::MakeMaker: 6.48
LWP                : 5.824
mod_perl           : -
mod_perl2          : 2.000004


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



This report was generated by bin/mp2bug on Mon Nov 30 17:25:35 2009 GMT.
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.