Author: stevehay
Date: Wed Nov  6 18:12:07 2013
New Revision: 1539414

URL: http://svn.apache.org/r1539414
Log:
Save the test suite from crashing httpd.exe on start-up:
- Use the correct pool in MP_dINTERP_POOLa.
- Delay the use of MP_dINTERP_POOLa until it's really needed. We don't seem to 
have an interpreter available at this time, but it so happens that the test 
suite doesn't exercise going this far through perl_parse_require_line() anyway, 
so this bypasses the crash for now.
- Add an early return with trace diagnostic when MP_dINTERP_POOLa returns NULL 
to continue bypassing the crash if the test suite is enhanced to exercise more 
of perl_parse_require_line(). The trace diagnostic will help alert us to the 
fact that the order of creating an interpreter vs. handling Require parsing is 
still unresolved.

Many thanks to Jeff Trawick++ for invaluable assistance in getting this far.

Modified:
    perl/modperl/branches/httpd24threading/src/modules/perl/modperl_util.c

Modified: perl/modperl/branches/httpd24threading/src/modules/perl/modperl_util.c
URL: 
http://svn.apache.org/viewvc/perl/modperl/branches/httpd24threading/src/modules/perl/modperl_util.c?rev=1539414&r1=1539413&r2=1539414&view=diff
==============================================================================
--- perl/modperl/branches/httpd24threading/src/modules/perl/modperl_util.c 
(original)
+++ perl/modperl/branches/httpd24threading/src/modules/perl/modperl_util.c Wed 
Nov  6 18:12:07 2013
@@ -984,52 +984,61 @@ static const char *perl_parse_require_li
                                            const char *require_line,
                                            const void **parsed_require_line)
 {
-    SV *ret_sv;
     char *ret = NULL;
-    int count;
     void *key;
     auth_callback *ab;
-    MP_dINTERP_POOLa(cmd->server->process->pool, cmd->server);
 
-    if (global_authz_providers == NULL) {
-        MP_INTERP_PUTBACK(interp, aTHX);
-        return ret;
+    if (global_authz_providers == NULL ||
+        apr_hash_count(global_authz_providers) == 0)
+    {
+        return NULL;
     }
 
     apr_pool_userdata_get(&key, AUTHZ_PROVIDER_NAME_NOTE, cmd->temp_pool);
     ab = apr_hash_get(global_authz_providers, (char *) key, 
APR_HASH_KEY_STRING);
     if (ab == NULL || ab->cb2 == NULL) {
-        MP_INTERP_PUTBACK(interp, aTHX);
-        return ret;
+        return NULL;
     }
 
     {
-        dSP;
-        ENTER;
-        SAVETMPS;
-        PUSHMARK(SP);
-        XPUSHs(sv_2mortal(modperl_ptr2obj(aTHX_ "Apache2::CmdParms", cmd)));
-        XPUSHs(sv_2mortal(newSVpv(require_line, 0)));
-        PUTBACK;
-        count = call_sv(ab->cb2, G_SCALAR);
-        SPAGAIN;
-
-        if (count == 1) {
-            ret_sv = POPs;
-            if (SvOK(ret_sv)) {
-                char *tmp = SvPV_nolen(ret_sv);
-                if (*tmp != '\0') {
-                    ret = apr_pstrdup(cmd->pool, tmp);
+        MP_dINTERP_POOLa(cmd->pool, cmd->server);
+        if (!interp) {
+            MP_TRACE_d(MP_FUNC, "require handler is not currently supported "
+                                "in this context");
+           return NULL;
+       }
+
+        {
+            SV *ret_sv;
+            int count;
+            dSP;
+
+            ENTER;
+            SAVETMPS;
+            PUSHMARK(SP);
+            XPUSHs(sv_2mortal(modperl_ptr2obj(aTHX_ "Apache2::CmdParms", 
cmd)));
+            XPUSHs(sv_2mortal(newSVpv(require_line, 0)));
+            PUTBACK;
+            count = call_sv(ab->cb2, G_SCALAR);
+            SPAGAIN;
+
+            if (count == 1) {
+                ret_sv = POPs;
+                if (SvOK(ret_sv)) {
+                    char *tmp = SvPV_nolen(ret_sv);
+                    if (*tmp != '\0') {
+                        ret = apr_pstrdup(cmd->pool, tmp);
+                    }
                 }
             }
+
+            PUTBACK;
+            FREETMPS;
+            LEAVE;
         }
 
-        PUTBACK;
-        FREETMPS;
-        LEAVE;
+        MP_INTERP_PUTBACK(interp, aTHX);
     }
-
-    MP_INTERP_PUTBACK(interp, aTHX);
     return ret;
 }
 


Reply via email to