You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@perl.apache.org by Adolph Torres <kh...@earthlink.net> on 2003/08/22 19:42:54 UTC
Re: ModPerl2/Apache2 - Error handling return codes -RegistryCooker.pm:"Argument"" isn't numeric ...& bottom of web page say:OK the server encounteredaninternal .....
Fri Aug 22 10:37:59 PDT
2003
Hello again,
Here is the result of those edits on this system. And I'm more than willing to continue
working this if you would like - but had to back it out as you'll see below.
Adolph
Torres
khmb1@earthlink.net
-------------------------------------------------------------------------------
#-
Snip of new edit to RegistryCooker.pm:
{ # run the code and
preserve warnings setup when it's done
no
warnings;
my
$r_iv=$$r;#people do things...
eval{$cv- ($r,@_)};
unless(ref($r) eq 'SCALAR' $$r==$r_iv){
warn "dude, your just killed \$r!($self- {FILENAME})\n";
$$r=$r_iv;#restore the IV slot
ModPerl::Global::special_list_call(END = $package);
}
--------------------------------------------------------------------------------------
#-
Restart of Apache (hton is my alias for apachectl startssl) failed with the
following:
[root@huffnpuff mysql]# hton
[Fri Aug 22 09:53:02 2003]
[error] Variable "%switches" will not stay shared at
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Apache2/ModPerl/RegistryCooker.pm
line 572.
Compilation failed in require at (eval 3) line 3.
...propagated at
/usr/lib/perl5/5.8.0/base.pm line 64.
BEGIN failed--compilation aborted at
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Apache2/ModPerl/Registry.pm
line 11.
Compilation failed in require at
/usr/local/httpd/prefork//startup.pl line 16.
BEGIN failed--compilation
aborted at /usr/local/httpd/prefork//startup.pl line 16.
Compilation failed
in require at (eval 1) line 1.
[Fri Aug 22 09:53:02 2003] [error] Can't
load Perl file: startup.pl for server huffnpuff:80, exiting...
-----------------------------------------------------------------------------------------------------------
#-
After commenting out the 'use Apache::Registry' (line 16) in startup.pl the
server started w/o error.
------------------------------------------------------------------------------------------------------
#-
Ran script1.pl (the one with the OK msg error from before) and it failed
with:
Internal Server Error
The server encountered an internal error
or misconfiguration and was unable to complete your
request.....
----------------------------------------------------------------------------------------------------
#-
error_log reported:
[Fri Aug 22 10:19:19 2003] [error] failed to resolve
handler `ModPerl::Registry'
[Fri Aug 22 10:19:19 2003] [error] [client
127.0.0.1] Variable "%switches" will not stay shared at
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Apache2/ModPerl/RegistryCooker.pm
line 572.
Compilation failed in require at (eval 7) line 3.
...propagated at /usr/lib/perl5/5.8.0/base.pm line 64.
BEGIN
failed--compilation aborted at
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Apache2/ModPerl/Registry.pm
line 11.
Compilation failed in require at (eval 6) line
3.
--------------------------------------------------------------------------------------------------------
#-
Running script2.pl (the one working after taking the pntr ref out) - same
error:
[Fri Aug 22 10:21:01 2003] [error] failed to resolve handler
`ModPerl::Registry'
[Fri Aug 22 10:21:01 2003] [error] [client 127.0.0.1]
Variable "%switches" will not stay shared at
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Apache2/ModPerl/RegistryCooker.pm
line 572.
Compilation failed in require at (eval 7) line 3.
...propagated at /usr/lib/perl5/5.8.0/base.pm line 64.
BEGIN
failed--compilation aborted at
/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Apache2/ModPerl/Registry.pm
line 11.
Compilation failed in require at (eval 6) line
3.
--------------------------------------------------------------------------------
#-
Here's my httpd.conf for mod_perl:
PerlModule Apache2
PerlModule
CGI::Cookie
PerlSetEnv MOD_PERL_TRACE all
# Added for regular
cgi's - 8.3.3
Alias /cgi-bin/
"/var/www/cgi-bin/"
Directory "/var/www/cgi-bin/"
SetHandler
perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions
+ParseHeaders
PerlSendHeader On
Options
+ExecCGI
/Directory
# Added for secured-scripts (SSL) - 8.4.3
Alias /sec/
/var/www/sec/
Location /sec/
SetHandler
perl-script
PerlResponseHandler ModPerl::Registry
PerlOptions
+ParseHeaders
PerlSendHeader On
Options
+ExecCGI
/Location
# Added for startup.pl - 8.4.3
PerlRequire startup.pl
# Added for
perl-status - 8.5.3
Location
/perl-status
SetHandler
perl-script
PerlResponseHandler Apache::Status
PerlOptions
+GlobalRequest
PerlSendHeader on
/Location
#
added as a test module - 8.18.3 ajt
PerlModule Test::Cookie
Location /Test/Cookie
SetHandler
perl-script
PerlHandler Test::Cookie
/Location
----- Original Message -----
From: Stas Bekman
To: khmb1@earthlink.net
Cc: dev@perl.apache.org ; Randy Kobes
Sent: 8/22/2003 12:33:26 AM
Subject: Re: ModPerl2/Apache2 - Error
handling return codes -RegistryCooker.pm:"Argument"" isn't numeric ...
bottom of web page say:OK the server encounteredaninternal .....
I'd still like to resolve this issue, here is the minimalistic registry
script
that reproduces the problem:
local (*in) = @_;
$in = 5;
this gets wrapped as:
sub handler {
local (*in) = @_;
$in = 5;
}
and then called as:
handler($r);
so the above code corrupts the guts $r, while keeping it a valid
object.
Here is Devel::Peek::Dump($r) before the above handler is called:
SV = RV(0x82c8cb8) at 0x81bcab0
REFCNT = 1
FLAGS = (PADBUSY,PADMY,ROK)
RV = 0x853a4c8
SV = PVMG(0x88d3190) at 0x853a4c8
REFCNT = 5
FLAGS = (OBJECT,IOK,pIOK)
IV = 143444264
NV = 0
PV = 0
STASH = 0x81de51c
"Apache::RequestRec"
Here it is after:
SV = RV(0x82c8cb8) at 0x81bcab0
REFCNT = 1
FLAGS = (PADBUSY,PADMY,ROK)
RV = 0x853a4c8
SV = PVMG(0x88d3190) at 0x853a4c8
REFCNT = 5
FLAGS = (OBJECT,IOK,pIOK)
IV = 5
NV = 0
PV = 0
STASH = 0x81de51c
"Apache::RequestRec"
as you can see it's essentially the same thing, but its IV slot which
contains
a C reference to the real object is now corrupted (got the assignment). So
there is no way to check whether the object is valid. But luckily we can
dereference the object and preserve it guts, no matter what horrors are
done
to it ;)
Here is my take on this issue
Index: lib/ModPerl/RegistryCooker.pm
===================================================================
RCS file:
/home/cvs/modperl-2.0/ModPerl-Registry/lib/ModPerl/RegistryCooker.pm,v
retrieving revision 1.35
diff -u -r1.35 RegistryCooker.pm
--- lib/ModPerl/RegistryCooker.pm 23 Mar 2003 04:52:24 -0000 1.35
+++ lib/ModPerl/RegistryCooker.pm 22 Aug 2003 07:30:27 -0000
@@ -181,7 +181,14 @@
{ # run the code and preserve warnings
setup when it's done
no
warnings;
+
+ my $r_iv = $$r; # people
do things...
eval {
$cv- ($r, @_) };
+ unless (ref($r) eq
'SCALAR' $$r == $r_iv) {
+ warn
"dude, you just killed \$r! ($self- {FILENAME})\n";
+ $$r
= $r_iv; # restore the IV slot
+ }
+
ModPerl::Global::special_list_call(END
= $package);
}
Adolph, please try your old code that you posted here earlier, after you
apply
this patch. RegistryCooker shouldn't be affected anylonger.
I'm not sure whether we should apply this patch. Comments?
__________________________________________________________________
Stas
Bekman JAm_pH
------ Just Another mod_perl Hacker
http://stason.org/
mod_perl Guide --- http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org http://ticketmaster.com
--- Adolph Torres
--- khmb1@earthlink.net
--- EarthLink: It's your Internet.
Re: ModPerl2/Apache2 - Error handling return codes -RegistryCooker.pm:"Argument""
isn't numeric ...& bottom of web page say:OK the server encounteredaninternal
.....
Posted by Stas Bekman <st...@stason.org>.
Adolph Torres wrote:
> Fri Aug 22 10:37:59 PDT 2003
> Hello again,
> Here is the result of those edits on this system. And I'm more than
> willing to continue working this if you would like - but had to back it
> out as you'll see below.
>
> Adolph Torres
> khmb1@earthlink.net
> -------------------------------------------------------------------------------
>
>
> #-> Snip of new edit to RegistryCooker.pm:
>
> { # run the code and preserve warnings setup when it's done
> no warnings;
> my $r_iv=$$r;#people do things...
> eval{$cv->($r,@_)};
> unless(ref($r) eq 'SCALAR' && $$r==$r_iv){
> warn "dude, your just killed \$r!($self->{FILENAME})\n";
> $$r=$r_iv;#restore the IV slot
> ModPerl::Global::special_list_call(END => $package);
> }
were you manually adjusting the code? You lost the closing brace. Just save
this patch as a file /tmp/patch and then apply it with
cd modperl-2.0/Modperl-Registry
patch -p0 < /tmp/patch
Index: lib/ModPerl/RegistryCooker.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/ModPerl-Registry/lib/ModPerl/RegistryCooker.pm,v
retrieving revision 1.35
diff -u -r1.35 RegistryCooker.pm
--- lib/ModPerl/RegistryCooker.pm 23 Mar 2003 04:52:24 -0000 1.35
+++ lib/ModPerl/RegistryCooker.pm 22 Aug 2003 07:30:27 -0000
@@ -181,7 +181,14 @@
{ # run the code and preserve warnings setup when it's done
no warnings;
+
+ my $r_iv = $$r; # people do things...
eval { $cv->($r, @_) };
+ unless (ref($r) eq 'SCALAR' && $$r == $r_iv) {
+ warn "dude, you just killed \$r! ($self->{FILENAME})\n";
+ $$r = $r_iv; # restore the IV slot
+ }
+
ModPerl::Global::special_list_call(END => $package);
}
__________________________________________________________________
Stas Bekman JAm_pH ------> Just Another mod_perl Hacker
http://stason.org/ mod_perl Guide ---> http://perl.apache.org
mailto:stas@stason.org http://use.perl.org http://apacheweek.com
http://modperlbook.org http://apache.org http://ticketmaster.com
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@perl.apache.org
For additional commands, e-mail: dev-help@perl.apache.org