You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@perl.apache.org by "Philippe M. Chiasson" <go...@ectoplasm.org> on 2006/01/21 02:53:46 UTC

Re: [mp2] 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 webmaster@dummy-host.example.com
>    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

Re: [mp2] block & PerlOptions +Parent & PerlRequire segfaults on 2.0.2, but not 2.0.1

Posted by "Philippe M. Chiasson" <go...@ectoplasm.org>.
Eamon Daly wrote:
> This patch worked like a charm for me. Thanks for the quick
> response!

Great, then a slightly different patch has been applied to SVN
in change 371775, documented in change 371776

Now there are 2 identical ways to specify Switch inheritance:

 - PerlSwitches +inherit (the old way, now works correctly)
 - PerlOptions +InheritSwitches (the new way, more generic)

--------------------------------------------------------------------------------
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

Re: [mp2] block & PerlOptions +Parent & PerlRequire segfaults on 2.0.2, but not 2.0.1

Posted by "Philippe M. Chiasson" <go...@ectoplasm.org>.
Eamon Daly wrote:
> This patch worked like a charm for me. Thanks for the quick
> response!

Great, then a slightly different patch has been applied to SVN
in change 371775, documented in change 371776

Now there are 2 identical ways to specify Switch inheritance:

 - PerlSwitches +inherit (the old way, now works correctly)
 - PerlOptions +InheritSwitches (the new way, more generic)

--------------------------------------------------------------------------------
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

Re: [mp2] block & PerlOptions +Parent & PerlRequire segfaults on 2.0.2, but not 2.0.1

Posted by Eamon Daly <ed...@nextwavemedia.com>.
This patch worked like a charm for me. Thanks for the quick
response!

____________________________________________________________
Eamon Daly



----- Original Message ----- 
From: "Philippe M. Chiasson" <go...@ectoplasm.org>
To: "Eamon Daly" <ed...@nextwavemedia.com>
Cc: <mo...@perl.apache.org>; <de...@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 webmaster@dummy-host.example.com
>>    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]
>