On Sun, 2003-12-14 at 19:13, [EMAIL PROTECTED] wrote:
> stas        2003/12/14 19:13:36
> 
>   Modified:    src/modules/perl modperl_mgv.c
>                .        Changes
>   Log:
>   Prevent a problem where an autovivified package (stash) prevents from
>   modperl_mgv to load the file with that package (until now it was
>   checking whether the stash existed already and skipped the loading if
>   that was the case). Now checking %INC and attempting to load the
>   module. Reporting the failure only if the module has failed to load
>   and the stash is not defined (so that it's possible to autovivify
>   packages without loading them from an external file).
>   
>   Revision  Changes    Path
>   1.28      +56 -12    modperl-2.0/src/modules/perl/modperl_mgv.c
>   
>   Index: modperl_mgv.c
>   ===================================================================
>   RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_mgv.c,v
>   retrieving revision 1.27
>   retrieving revision 1.28
>   diff -u -u -r1.27 -r1.28
>   --- modperl_mgv.c   18 Sep 2003 07:58:46 -0000      1.27
>   +++ modperl_mgv.c   15 Dec 2003 03:13:36 -0000      1.28
>   @@ -181,6 +181,31 @@
>    }
>    #endif
>    
>   +
>   +static void package2filename(apr_pool_t *p, const char *package,
>   +                             char **filename, int *len)
>   +{
>   +    *filename = apr_palloc(p, (strlen(package)+4)*sizeof(char));
>   +    const char *s;
>   +    char *d;

Sorry, I know how annoying this problem can be :

modperl_mgv.c: In function `package2filename':
modperl_mgv.c:189: warning: ISO C90 forbids mixed declarations and code

Reorded and checked-in!

>   +    for (s = package, d = *filename; *s; s++, d++) {
>   +        if (*s == ':' && s[1] == ':') {
>   +            *d = '/';
>   +            s++;
>   +        }
>   +        else {
>   +            *d = *s;
>   +        }
>   +    }
>   +    *d++ = '.';
>   +    *d++ = 'p';
>   +    *d++ = 'm';
>   +    *d   = '\0';
>   +
>   +    *len = d - *filename;
>   +}
>   +
>    /* currently used for complex filters attributes parsing */
>    /* XXX: may want to generalize it for any handlers */
>    #define MODPERL_MGV_DEEP_RESOLVE(handler, p) \
>   @@ -259,23 +284,42 @@
>            }
>        }
>    
>   -    if (!(stash || (stash = gv_stashpv(name, FALSE))) &&
>   -        MpHandlerAUTOLOAD(handler)) {
>   -        MP_TRACE_h(MP_FUNC,
>   -                   "package %s not defined, attempting to load\n", name);
>   -
>   -        if (modperl_require_module(aTHX_ name, FALSE)) {
>   -            MP_TRACE_h(MP_FUNC, "loaded %s package\n", name);
>   -            if (!(stash = gv_stashpv(name, FALSE))) {
>   -                MP_TRACE_h(MP_FUNC, "%s package still does not exist\n",
>   -                           name);
>   +    if (!stash && MpHandlerAUTOLOAD(handler)) {
>   +        int len;
>   +        char *filename;
>   +        SV **svp;
>   +
>   +        package2filename(p, name, &filename, &len);
>   +        svp = hv_fetch(GvHVn(PL_incgv), filename, len, 0);
>   +
>   +        if (!(svp && *svp != &PL_sv_undef)) { /* not in %INC */
>   +            MP_TRACE_h(MP_FUNC,
>   +                       "package %s not in %INC, attempting to load '%s'\n",
>   +                       name, filename);
>   +
>   +            if (modperl_require_module(aTHX_ name, FALSE)) {
>   +                MP_TRACE_h(MP_FUNC, "loaded %s package\n", name);
>   +            }
>   +            else {
>   +                MP_TRACE_h(MP_FUNC, "failed to load %s package\n", name);
>                    return 0;
>                }
>            }
>            else {
>   -            MP_TRACE_h(MP_FUNC, "failed to load %s package\n", name);
>   -            return 0;
>   +            MP_TRACE_h(MP_FUNC, "package %s seems to be loaded\n"
>   +                       "  $INC{%s)='%s';\n",
>   +                       name, filename, SvPV_nolen(*svp));
>            }
>   +    }
>   +
>   +    /* try to lookup the stash only after loading the module, to avoid
>   +     * the case where a stash is autovivified by a user before the
>   +     * module was loaded, preventing from loading the module
>   +     */
>   +    if (!(stash || (stash = gv_stashpv(name, FALSE)))) {
>   +        MP_TRACE_h(MP_FUNC, "package %s seems to be loaded, "
>   +                   "but can't find its stash\n", name);
>   +        return 0;
>        }
>    
>        if ((gv = gv_fetchmethod(stash, handler_name)) && (cv = GvCV(gv))) {
>   
>   
>   
>   1.281     +8 -0      modperl-2.0/Changes
>   
>   Index: Changes
>   ===================================================================
>   RCS file: /home/cvs/modperl-2.0/Changes,v
>   retrieving revision 1.280
>   retrieving revision 1.281
>   diff -u -u -r1.280 -r1.281
>   --- Changes 15 Dec 2003 02:50:22 -0000      1.280
>   +++ Changes 15 Dec 2003 03:13:36 -0000      1.281
>   @@ -12,6 +12,14 @@
>    
>    =item 1.99_12-dev
>    
>   +Prevent a problem where an autovivified package (stash) prevents from
>   +modperl_mgv to load the file with that package (until now it was
>   +checking whether the stash existed already and skipped the loading if
>   +that was the case). Now checking %INC and attempting to load the
>   +module. Reporting the failure only if the module has failed to load
>   +and the stash is not defined (so that it's possible to autovivify
>   +packages without loading them from an external file). [Stas]
>   +
>    MaxClients is now overridable from the t/TEST -maxclients command line
>    option (it was hardcoded before). [Stas]
>    
>   
>   
>   
-- 
--------------------------------------------------------------------------------
Philippe M. Chiasson /gozer\@(cpan|ectoplasm)\.org/ 88C3A5A5 (122FF51B/C634E37B)
http://gozer.ectoplasm.org/    F9BF E0C2 480E 7680 1AE5 3631 CB32 A107 88C3 A5A5
Q: It is impossible to make anything foolproof because fools are so ingenious.
perl -e'$$=\${gozer};{$_=unpack(P7,pack(L,$$));/^JAm_pH\n$/&&print||$$++&&redo}'

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to