On Wed, Jan 02, 2002 at 01:34:57PM -0500, Bill Stoddard wrote: > I see this pattern several places in the code: > > rc = apr_get_brigade(); > if (rc != APR_SUCCESS) { > fail; > } > /* Is the brigade empty? */ > if (APR_BRIGADE_EMPTY(b)) { > fail; > } > /* Get first bucket */ > e = APR_BRIGADE_FIRST(b); > > /* Is the bucket an EOS? */ > if (APR_BUCKET_IS_EOS(e)) { > } > > /* Does the bucket have zero length? */ > if (e->length == 0) { > } > > You have to make these checks each and everytime we fetch a brigade which seems > unintuitive. Should a apr_bucket_read() call on a bucket with e->length == 0 cause a >seg > fault? Seems this check is masking a deeper problem.
Yeah, this is wonky, but a brigade-using function *should* be able to handle a 0-length bucket. I can't imagine why it shouldn't. However, when the socket bucket disappears in apr_bucket_read, we often morph it to an immortal bucket of length 0. What I'm not sure is if that happens to get returned by core_input_filter or not - this morning, I'm thinking it doesn't. Last night, I thought it did. Last night, I did remove one of the cases where the 0-length bucket is inserted into the returned brigade. But, I think the socket may still muck things up. -- justin