Christopher H. Laco wrote:
No love. This block segfaults my apache2/mp2:

if (exists $ENV{MOD_PERL_API_VERSION} && $ENV{MOD_PERL_API_VERSION} == 2) {
        require Apache2::RequestRec;
        require Apache2::RequestUtil;
        require Apache2::RequestIO;
        require Apache2::ServerUtil;

my $c = eval {Apache2::RequestUtil->request} || Apache2::ServerUtil->server;

        if ($c) {
            $value = $c->dir_config($key) || $ENV{$key} || $default;
        };
    } elsif ($ENV{MOD_PERL}) {


Commenting out the eval line lets the server run fine and dandy. :-(

-=Chris

Oh geez. I think I found the most obscure bug ever. :-/
I'm working on narrowing down the code to a test case. In a nutshell of seudo code, it looks like this:

$ rm -rf /var/tmp/.*

use Data::UUID;
use Apache2::RequestRec;
use Apache2::RequestUtil;
use Apache2::RequestIO;
use Apache2::ServerRec;
use Apache2::ServerUtil;

my $ug = Data::UUID->new;
my $uuid = $ug->create;
print $ug->to_string($uuid);


There is some variance in there.

If I simply 'require' instead of 'use' all of the Apache2 modules, all works fine, unless I call ->dir_config, then it goes boom.

It only happens on the first call to Data::UUID, where it creates two state files in /var/tmp. Every request after that initial segfault works just dandy. On the segfaulted run, it creates the first file, and dies on creating the second. If I run the code again, it creates the second and goes just dandy.... only if I use the Apache modules, or 'require' them and call dir_config.

If I take the apache2 modules out of the picture and clean /var/tmp, the first call to Data::UUID succeeds , it creates both files in temp, and there are no segfaults.

Like I said, the strangest damn thing I've ever seen.

More to come when I get a specific narrowed test case and a ktrace for it.

-=Chris


Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to