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}'
signature.asc
Description: This is a digitally signed message part