stas 2004/05/21 11:35:23
Modified: xs/APR/Bucket APR__Bucket.h
Log:
- read now returns data and throws exceptions
- make sure that the offset/len are in boundary
Revision Changes Path
1.7 +30 -23 modperl-2.0/xs/APR/Bucket/APR__Bucket.h
Index: APR__Bucket.h
===================================================================
RCS file: /home/cvs/modperl-2.0/xs/APR/Bucket/APR__Bucket.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -u -r1.6 -r1.7
--- APR__Bucket.h 4 Mar 2004 06:01:09 -0000 1.6
+++ APR__Bucket.h 21 May 2004 18:35:23 -0000 1.7
@@ -18,40 +18,47 @@
static apr_bucket *mpxs_APR__Bucket_new(pTHX_ SV *classname, SV *sv,
int offset, int len)
{
- if (!len) {
- (void)SvPV(sv, len);
- }
- return modperl_bucket_sv_create(aTHX_ sv, offset, len);
-}
+ int full_len;
+ (void)SvPV(sv, full_len);
-/* this is just so C::Scan will pickup the prototype */
-static MP_INLINE apr_status_t modperl_bucket_read(apr_bucket *bucket,
- const char **str,
- apr_size_t *len,
- apr_read_type_e block)
-{
- return apr_bucket_read(bucket, str, len, block);
+ if (len) {
+ if (len > full_len - offset) {
+ Perl_croak(aTHX_ "APR::Bucket::new: the length argument can't be"
+ " bigger than the total buffer length minus offset");
+ }
+ }
+ else {
+ len = full_len - offset;
+ }
+
+ return modperl_bucket_sv_create(aTHX_ sv, offset, len);
}
-static MP_INLINE apr_status_t mpxs_modperl_bucket_read(pTHX_
- apr_bucket *bucket,
- SV *buffer,
- apr_read_type_e block)
+static MP_INLINE SV *mpxs_APR__Bucket_read(pTHX_
+ apr_bucket *bucket,
+ apr_read_type_e block)
{
- int rc;
+ SV *buf;
apr_size_t len;
const char *str;
+ apr_status_t rc = apr_bucket_read(bucket, &str, &len, block);
+
+ if (rc == APR_EOF) {
+ return newSVpvn("", 0);
+ }
- rc = modperl_bucket_read(bucket, &str, &len, block);
-
- if ((rc != APR_SUCCESS) && (rc != APR_EOF)) {
- /* XXX: croak ? */
+ if (rc != APR_SUCCESS) {
+ modperl_croak(aTHX_ rc, "APR::Bucket::read");
}
- sv_setpvn(buffer, str, len);
+ buf = newSVpvn(str, len);
- return rc;
+ /* XXX: must be on, but utf8::decode fails to parse it as UTF-8
+ * flag in 5.8.4 if the input is utf8 */
+ //SvTAINTED_on(buf);
+
+ return buf;
}
static MP_INLINE int mpxs_APR__Bucket_is_eos(apr_bucket *bucket)