Author: torsten Date: Fri Aug 1 09:59:55 2008 New Revision: 681749 URL: http://svn.apache.org/viewvc?rev=681749&view=rev Log: Merged revisions 672819,681118 via svnmerge from https://svn.eu.apache.org/repos/asf/perl/modperl/trunk
........ r672819 | torsten | 2008-06-30 18:51:30 +0200 (Mon, 30 Jun 2008) | 1 line silence some "unused" warnings ........ r681118 | torsten | 2008-07-30 18:48:12 +0200 (Wed, 30 Jul 2008) | 1 line a few enhancements to Apache2::RequestIO::read plus bugfix: read() used to clear the buffer at end of file. Now it return 0 but does not touch the buffer ........ Added: perl/modperl/branches/threading/t/apache/read3.t - copied unchanged from r681118, perl/modperl/trunk/t/apache/read3.t perl/modperl/branches/threading/t/apache/read4.t - copied unchanged from r681118, perl/modperl/trunk/t/apache/read4.t perl/modperl/branches/threading/t/response/TestApache/read3.pm - copied unchanged from r681118, perl/modperl/trunk/t/response/TestApache/read3.pm perl/modperl/branches/threading/t/response/TestApache/read4.pm - copied unchanged from r681118, perl/modperl/trunk/t/response/TestApache/read4.pm Modified: perl/modperl/branches/threading/ (props changed) perl/modperl/branches/threading/Changes perl/modperl/branches/threading/xs/Apache2/RequestIO/Apache2__RequestIO.h Propchange: perl/modperl/branches/threading/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Fri Aug 1 09:59:55 2008 @@ -1 +1 @@ -/perl/modperl/trunk:594682-672484 +/perl/modperl/trunk:594682-672484,672819-681118 Propchange: perl/modperl/branches/threading/ ------------------------------------------------------------------------------ --- svnmerge-integrated (original) +++ svnmerge-integrated Fri Aug 1 09:59:55 2008 @@ -1 +1 @@ -/perl/modperl/trunk:1-672628 +/perl/modperl/trunk:1-681650 Modified: perl/modperl/branches/threading/Changes URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/Changes?rev=681749&r1=681748&r2=681749&view=diff ============================================================================== --- perl/modperl/branches/threading/Changes (original) +++ perl/modperl/branches/threading/Changes Fri Aug 1 09:59:55 2008 @@ -31,6 +31,10 @@ =item 2.0.5-dev +Make sure Apache2::RequestIO::read doesn't clear the buffer on end of +file and handle negative offsets and offsets that are larger than +the current string length. [Torsten Foertsch] + Fix a problem that could make APR::XSLoader and Apache2::XSLoader load the wrong shared library. [Torsten Foertsch] Modified: perl/modperl/branches/threading/xs/Apache2/RequestIO/Apache2__RequestIO.h URL: http://svn.apache.org/viewvc/perl/modperl/branches/threading/xs/Apache2/RequestIO/Apache2__RequestIO.h?rev=681749&r1=681748&r2=681749&view=diff ============================================================================== --- perl/modperl/branches/threading/xs/Apache2/RequestIO/Apache2__RequestIO.h (original) +++ perl/modperl/branches/threading/xs/Apache2/RequestIO/Apache2__RequestIO.h Fri Aug 1 09:59:55 2008 @@ -235,28 +235,37 @@ apr_off_t offset) { SSize_t total; + STRLEN blen; if (!SvOK(buffer)) { sv_setpvn(buffer, "", 0); } + (void)SvPV_force(buffer, blen); /* make it a valid PV */ + if (len <= 0) { Perl_croak(aTHX_ "The LENGTH argument can't be negative"); } - /* XXX: need to handle negative offset */ - /* XXX: need to pad with \0 if offset > size of the buffer */ + /* handle negative offset */ + if (offset < 0) { + if (-offset > (int)blen) Perl_croak(aTHX_ "Offset outside string"); + offset += blen; + } mpxs_sv_grow(buffer, len+offset); - total = modperl_request_read(aTHX_ r, SvPVX(buffer)+offset, len); - if (total > 0) { - mpxs_sv_cur_set(buffer, offset+total); - } - else { - sv_setpvn(buffer, "", 0); + /* need to pad with \0 if offset > size of the buffer */ + if (offset > SvCUR(buffer)) { + Zero(SvEND(buffer), offset - SvCUR(buffer), char); } + total = modperl_request_read(aTHX_ r, SvPVX(buffer)+offset, len); + + /* modperl_request_read can return only >=0. So it's safe to do this. */ + /* if total==0 we need to set the buffer length in case it is larger */ + mpxs_sv_cur_set(buffer, offset+total); + /* must run any set magic */ SvSETMAGIC(buffer);