Incredibly thorough bug reporting, many thanks.

You correctly identified a leak and can you give the following
patch a spin and let me know if it plugs it?

Rici Lake wrote:
On 8-Sep-04, at 5:24 PM, Philippe M. Chiasson wrote:

Could you please post the 2 .htaccess files you've been using ?



[EMAIL PROTECTED]:/usr/local/www/data/foo$ cat .htaccess
<perl>
$AuthType = "basic";
$AuthName = "foo";
$AuthUserFile = "/usr/local/www/.htpasswd";
$require = "valid-user";
$order = "deny,allow";
$allow = "from all";
$satisfy = "any";
</perl>

[EMAIL PROTECTED]:/usr/local/www/data/foo$ cat .htaccess.plain
#<perl>
AuthType basic
AuthName foo
AuthUserFile /usr/local/www/.htpasswd
require valid-user
order deny,allow
allow from all
satisfy any
#</perl>

Hrm, that's quite odd, as I looked over the code and AFAIK, <Perl> sections
in .htaccess will be running off parms->pool, and in the case of .htaccess
files, that's r->pool. Can you tell me more about how you made the determination
that it was using the pconf ?


Ok.

The handler for <Perl> (in modperl_cmd.c at line 418, MP_CMD_SRV_DECLARE(perl)) appears to use the pool passed to it by the config reader, which should be r->pool in an .htaccess file. But all it does with it is concatenate the lines up to the closing </Perl> directive into a single string, and use that to create a Perl directive which it inserts into the command stream.

So that drops us into MP_CMD_SRV_DECLARE(perldo), immediately following in the same file.

That function, afaics, starts by checking for options that might have been set in the <Perl> directive itself (which it finds in directive->data thanks to the <Perl> directive handler) and if there are none, as in my simple test, uses Apache::PerlSections as the handler and Apache::ReadConfig as the package. It then prepends the original <Perl> section, now in directive->arg, with the package name and executes it, at around line 538. If that all goes well, it does a callback into the handler with modperl_callback.

So, taking a wild guess, I looked in Apache/PerlSections.pm, and indeed that seems to be where the directives are created, by being pushed one at a time into the array $self->directives. Finally self->post_config gets called, and it in turn calls $self->server->add_config with the directives.

According to the mapping in xs/Apache/ServerUtil/Apache__ServerUtil.h, that ought to end up calling modperl_config_insert_server, which is found in modperl_config.c. That function extracts pconf from the server record, and calls modperl_config_insert with it, at which point the configuration directives are fed into the Apache machinery.

Which is why I figured that it was using pconf.

I was actually just trying to figure out why directives were not being placed into the configtree -- the reason is that modperl_config_insert doesn't hook them into the tree. This doesn't matter for .htaccess files; I just happened to notice that the .htaccess code path appeared to be the same as the main config file code path.

So I tested it, and the test seemed to confirm my suspicions.



-- -------------------------------------------------------------------------------- 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: lib/Apache/PerlSections.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/lib/Apache/PerlSections.pm,v
retrieving revision 1.7
diff -u -I$Id -r1.7 PerlSections.pm
--- lib/Apache/PerlSections.pm	23 Aug 2004 21:16:27 -0000	1.7
+++ lib/Apache/PerlSections.pm	9 Sep 2004 17:49:47 -0000
@@ -34,7 +34,7 @@
     return bless { @args }, ref($package) || $package;
 }
 
-sub server     { return shift->{'parms'}->server() }
+sub parms      { return shift->{'parms'} }
 sub directives { return shift->{'directives'} ||= [] }
 sub package    { return shift->{'args'}->{'package'} }
 
@@ -200,7 +200,7 @@
 
 sub post_config {
     my($self) = @_;
-    my $errmsg = $self->server->add_config($self->directives);
+    my $errmsg = $self->parms->add_config($self->directives);
     die $errmsg if $errmsg;
 }
 
Index: src/modules/perl/modperl_config.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.c,v
retrieving revision 1.80
diff -u -I$Id -r1.80 modperl_config.c
--- src/modules/perl/modperl_config.c	6 Jul 2004 22:06:04 -0000	1.80
+++ src/modules/perl/modperl_config.c	9 Sep 2004 17:49:48 -0000
@@ -561,6 +561,20 @@
     return errmsg;
 }
 
+const char *modperl_config_insert_parms(pTHX_ cmd_parms *parms, 
+                                        SV *lines)
+{
+    return modperl_config_insert(aTHX_ 
+                                 parms->server, 
+                                 parms->pool, 
+                                 parms->temp_pool,
+                                 parms->override, 
+                                 parms->path,
+                                 parms->context,
+                                 lines);
+}
+
+
 const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines)
 {
     int override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT);
Index: src/modules/perl/modperl_config.h
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_config.h,v
retrieving revision 1.34
diff -u -I$Id -r1.34 modperl_config.h
--- src/modules/perl/modperl_config.h	6 Jul 2004 22:06:04 -0000	1.34
+++ src/modules/perl/modperl_config.h	9 Sep 2004 17:49:48 -0000
@@ -130,6 +130,9 @@
                                   ap_conf_vector_t *conf,
                                   SV *lines);
 
+const char *modperl_config_insert_parms(pTHX_ cmd_parms *parms, 
+                                        SV *lines);
+
 const char *modperl_config_insert_server(pTHX_ server_rec *s, SV *lines);
 
 const char *modperl_config_insert_request(pTHX_
Index: xs/Apache/CmdParms/Apache__CmdParms.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/Apache/CmdParms/Apache__CmdParms.h,v
retrieving revision 1.3
diff -u -I$Id -r1.3 Apache__CmdParms.h
--- xs/Apache/CmdParms/Apache__CmdParms.h	14 Apr 2004 03:41:39 -0000	1.3
+++ xs/Apache/CmdParms/Apache__CmdParms.h	9 Sep 2004 17:49:48 -0000
@@ -26,3 +26,12 @@
 
     return &PL_sv_undef;    
 }
+
+static MP_INLINE
+void mpxs_Apache__CmdParms_add_config(pTHX_ cmd_parms *parms, SV *lines)
+{
+    const char *errmsg = modperl_config_insert_parms(aTHX_ parms, lines);
+    if (errmsg) {
+        Perl_croak(aTHX_ "$parms->add_config() has failed: %s", errmsg);
+    }
+}
Index: xs/maps/modperl_functions.map
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/maps/modperl_functions.map,v
retrieving revision 1.85
diff -u -I$Id -r1.85 modperl_functions.map
--- xs/maps/modperl_functions.map	25 Aug 2004 21:51:21 -0000	1.85
+++ xs/maps/modperl_functions.map	9 Sep 2004 17:49:48 -0000
@@ -145,6 +145,7 @@
  ap_check_cmd_context
  ap_method_is_limited
  mpxs_Apache__CmdParms_info
+ mpxs_Apache__CmdParms_add_config
 
 MODULE=Apache::MPM    PACKAGE=Apache::MPM   BOOT=1
  mpxs_Apache__MPM_query
Index: xs/tables/current/ModPerl/FunctionTable.pm
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/tables/current/ModPerl/FunctionTable.pm,v
retrieving revision 1.177
diff -u -I$Id -r1.177 FunctionTable.pm
--- xs/tables/current/ModPerl/FunctionTable.pm	8 Sep 2004 00:42:02 -0000	1.177
+++ xs/tables/current/ModPerl/FunctionTable.pm	9 Sep 2004 17:49:48 -0000
@@ -2,7 +2,7 @@
 
 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 # ! WARNING: generated by ModPerl::ParseSource/0.01
-# !          Mon Aug 30 22:40:23 2004
+# !          Thu Sep  9 10:08:16 2004
 # !          do NOT edit, any changes will be lost !
 # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
@@ -1356,6 +1356,24 @@
   },
   {
     'return_type' => 'const char *',
+    'name' => 'modperl_config_insert_parms',
+    'args' => [
+      {
+        'type' => 'PerlInterpreter *',
+        'name' => 'my_perl'
+      },
+      {
+        'type' => 'cmd_parms *',
+        'name' => 'parms'
+      },
+      {
+        'type' => 'SV *',
+        'name' => 'lines'
+      }
+    ]
+  },
+  {
+    'return_type' => 'const char *',
     'name' => 'modperl_config_insert_request',
     'args' => [
       {
@@ -5744,6 +5762,24 @@
       {
         'type' => 'apr_uri_t *',
         'name' => 'apr_uri'
+      }
+    ]
+  },
+  {
+    'return_type' => 'void',
+    'name' => 'mpxs_Apache__CmdParms_add_config',
+    'args' => [
+      {
+        'type' => 'PerlInterpreter *',
+        'name' => 'my_perl'
+      },
+      {
+        'type' => 'cmd_parms *',
+        'name' => 'parms'
+      },
+      {
+        'type' => 'SV *',
+        'name' => 'lines'
       }
     ]
   },

Attachment: signature.asc
Description: OpenPGP digital signature



Reply via email to