stas 2003/10/14 17:40:56
Modified: src/modules/perl modperl_io_apache.c Log: add protection against possible uses of stale filehandles, and some extra tracing for open/close Revision Changes Path 1.5 +18 -6 modperl-2.0/src/modules/perl/modperl_io_apache.c Index: modperl_io_apache.c =================================================================== RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_io_apache.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -u -r1.4 -r1.5 --- modperl_io_apache.c 4 Sep 2003 03:31:50 -0000 1.4 +++ modperl_io_apache.c 15 Oct 2003 00:40:56 -0000 1.5 @@ -44,6 +44,7 @@ if (arg) { st->r = modperl_sv2request_rec(aTHX_ arg); + MP_TRACE_o(MP_FUNC, "stored request_rec obj: 0x%lx", st->r); } else { Perl_croak(aTHX_ "$r wasn't passed"); @@ -54,8 +55,6 @@ * 'mode' */ code = PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab); - MP_TRACE_o(MP_FUNC, "done"); - return code; } @@ -142,13 +141,20 @@ PerlIOApache_flush(pTHX_ PerlIO *f) { PerlIOApache *st = PerlIOSelf(f, PerlIOApache); - modperl_config_req_t *rcfg = modperl_config_req_get(st->r); + modperl_config_req_t *rcfg; + + if (!st->r) { + Perl_warn(aTHX_ "an attempt to flush a stale IO handle"); + return -1; + } /* no flush on readonly io handle */ if (! (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) ) { return -1; } + rcfg = modperl_config_req_get(st->r); + MP_CHECK_WBUCKET_INIT("flush"); MP_TRACE_o(MP_FUNC, "%d bytes [%s]", rcfg->wbucket->outcnt, @@ -169,9 +175,15 @@ static IV PerlIOApache_close(pTHX_ PerlIO *f) { - /* XXX: just temp for tracing */ - MP_TRACE_o(MP_FUNC, "done"); - return PerlIOBase_close(aTHX_ f); + IV code = PerlIOBase_close(aTHX_ f); + PerlIOApache *st = PerlIOSelf(f, PerlIOApache); + + MP_TRACE_o(MP_FUNC, "done with request_rec obj: 0x%lx", st->r); + /* prevent possible bugs where a stale r will be attempted to be + * reused (e.g. dupped filehandle) */ + st->r = NULL; + + return code; } static IV