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)
  
  
  

Reply via email to