This patch worked like a charm for me. Thanks for the quick
response!

____________________________________________________________
Eamon Daly



----- Original Message ----- From: "Philippe M. Chiasson" <[EMAIL PROTECTED]>
To: "Eamon Daly" <[EMAIL PROTECTED]>
Cc: <modperl@perl.apache.org>; <dev@perl.apache.org>
Sent: Friday, January 20, 2006 7:53 PM
Subject: Re: [mp2] <Perl> block & PerlOptions +Parent & PerlRequire segfaults on 2.0.2, but not 2.0.1


Eamon Daly wrote:
1. Problem Description:

If I declare a <Perl> section in httpd.conf, then define
a virtual host with "PerlOptions +Parent", httpd dies with
a segfault on subsequent PerlRequires. This works in 2.0.1.
Here's a minimal example, tacked on to the end of the
default httpd.conf:

--- httpd.conf ---

<Perl>
1;
</Perl>

<VirtualHost _default_:80>
   ServerAdmin [EMAIL PROTECTED]
   DocumentRoot /www/docs/dummy-host.example.com
   ServerName dummy-host.example.com
   ErrorLog logs/dummy-host.example.com-error_log
   CustomLog logs/dummy-host.example.com-access_log common
   PerlOptions +Parent
   PerlRequire /etc/httpd/conf/startup.pl
</VirtualHost>

--- startup.pl ---

use strict;

1;

Is this just bad syntax on our part that luckily Just
Worked or is this broken behavior in 2.0.2?

This is certainly a bug and was, if not introduced, aggravated by this change
of mine [291193].

It exposed a bug in the implementation of "PerlSwitches +inherit" [1], which led
me to realize that it was broken. This bit of code is seriously wrong:

in src/modules/perl/modperl_cmd.c:
if (add->argv->nelts == 2 && strEQ(((char **)add->argv->elts)[1], "+inherit")) {

That's making quite a few incorrect assumptions. Like that the '+inherit' option would always be the second one, and only recognized if it was the second one.

On top of that, specifying

PerlSwitches +inherit

in your httpd.conf, it would end up in the argv that's passed to perl_parse(), so you'd
end up with this lovely startup error:

Can't open perl script "+inherit": No such file or directory
perl_parse: No such file or directory

After some initial tinkering, I think the following patch is a much better solution. I've made the switch inheriting option a proper per-server config, and I skip adding
it to perl's argv[].

Let me know if this solves your problem.

1      - http://perl.apache.org/docs/2.0/user/config/config.html#C_Clone_
291193 - (http://svn.apache.org/viewcvs.cgi?rev=291193&view=rev)

--------------------------------------------------------------------------------
Philippe M. Chiasson m/gozer\@(apache|cpan|ectoplasm)\.org/ GPG KeyID : 88C3A5A5 http://gozer.ectoplasm.org/ F9BF E0C2 480E 7680 1AE5 3631 CB32 A107 88C3A5A5



--------------------------------------------------------------------------------


Index: src/modules/perl/modperl_config.c
===================================================================
--- src/modules/perl/modperl_config.c (revision 370942)
+++ src/modules/perl/modperl_config.c (working copy)
@@ -302,9 +302,7 @@
    merge_item(perl);
#endif

-    if (add->argv->nelts == 2 &&
-        strEQ(((char **)add->argv->elts)[1], "+inherit"))
-    {
+    if (MpSrvINHERIT(add)) {
        /* only inherit base PerlSwitches if explicitly told to */
        mrg->argv = base->argv;
    }
Index: src/modules/perl/modperl_cmd.c
===================================================================
--- src/modules/perl/modperl_cmd.c (revision 370942)
+++ src/modules/perl/modperl_cmd.c (working copy)
@@ -156,7 +156,13 @@
        return modperl_cmd_too_late(parms);
    }
    MP_TRACE_d(MP_FUNC, "arg = %s\n", arg);
-    modperl_config_srv_argv_push(arg);
+
+    if(0 == strncasecmp(arg, "+inherit", 8)) {
+        modperl_cmd_options(parms, mconfig, "+Inherit");
+    }
+    else {
+        modperl_config_srv_argv_push(arg);
+    }
    return NULL;
}

Index: t/conf/extra.last.conf.in
===================================================================
--- t/conf/extra.last.conf.in (revision 370942)
+++ t/conf/extra.last.conf.in (working copy)
@@ -94,3 +94,11 @@
=cut

PerlSetVar TestDirective__pod_cut_worked yes
+
+#This used to trigger a segfault on startup
+#See http://article.gmane.org/gmane.comp.apache.mod-perl/22750
+<VirtualHost inherit>
+   PerlSwitches +inherit
+   PerlOptions +Parent
+   Perl 1
+</VirtualHost>
Index: lib/ModPerl/Code.pm
===================================================================
--- lib/ModPerl/Code.pm (revision 370942)
+++ lib/ModPerl/Code.pm (working copy)
@@ -137,7 +137,7 @@
my @ithread_opts = qw(CLONE PARENT);
my %flags = (
    Srv => ['NONE', @ithread_opts, qw(ENABLE AUTOLOAD MERGE_HANDLERS),
-            @hook_flags, 'UNSET'],
+            @hook_flags, 'UNSET','INHERIT'],
Dir => [qw(NONE PARSE_HEADERS SETUP_ENV MERGE_HANDLERS GLOBAL_REQUEST UNSET)],
    Req => [qw(NONE SET_GLOBAL_REQUEST PARSE_HEADERS SETUP_ENV
               CLEANUP_REGISTERED PERL_SET_ENV_DIR PERL_SET_ENV_SRV)],
Index: Changes
===================================================================
--- Changes (revision 370942)
+++ Changes (working copy)
@@ -12,6 +12,9 @@

=item 2.0.3-dev

+Fix 'PerlSwitches +inherit' that got broken somewhere along
+the way to 2.0 [Gozer]
+
Add perl API corresponding to User and Group directives in httpd.conf:
Apache2::ServerUtil->user_id and Apache2::ServerUtil->group_id
[Stas]


Reply via email to