Valid question. The failure can only happen when a bucket of indeterminate length fails the read.
I think the prototype of h2_util_has_eos() needs to change to return arp_status_t and have an int* for the flag. But that change I do not want to do right now for the 2.4.17... //Stefan > Am 08.10.2015 um 12:11 schrieb Yann Ylavic <ylavic....@gmail.com>: > > Hi Stefan, > > On Thu, Oct 8, 2015 at 12:06 PM, Stefan Eissing > <stefan.eiss...@greenbytes.de> wrote: >> >> Index: modules/http2/h2_util.c >> =================================================================== >> --- modules/http2/h2_util.c (revision 1707467) >> +++ modules/http2/h2_util.c (revision 1707468) >> @@ -484,20 +484,39 @@ >> >> int h2_util_has_eos(apr_bucket_brigade *bb, apr_size_t len) >> { >> - apr_bucket *b, *end; >> + apr_bucket *b; >> >> - apr_status_t status = last_not_included(bb, len, 0, 0, &end); >> - if (status != APR_SUCCESS) { >> - return status; >> + if (len == 0) { >> + /* special case: this is only true, if there are only meta >> + * and an eos bucket in the brigade head. >> + */ >> + for (b = APR_BRIGADE_FIRST(bb); >> + b != APR_BRIGADE_SENTINEL(bb); >> + b = APR_BUCKET_NEXT(b)) >> + { >> + if (!APR_BUCKET_IS_METADATA(b) && b->length != 0) { >> + break; >> + } >> + else if (APR_BUCKET_IS_EOS(b)) { >> + return 1; >> + } >> + } >> } >> - >> - for (b = APR_BRIGADE_FIRST(bb); >> - b != APR_BRIGADE_SENTINEL(bb) && b != end; >> - b = APR_BUCKET_NEXT(b)) >> - { >> - if (APR_BUCKET_IS_EOS(b)) { >> - return 1; >> + else { >> + apr_bucket *end; >> + apr_status_t status = last_not_included(bb, len, 0, 0, &end); >> + if (status != APR_SUCCESS) { >> + return status; > > Do we want to assume EOS when last_not_included() fails? > >> } >> + >> + for (b = APR_BRIGADE_FIRST(bb); >> + b != APR_BRIGADE_SENTINEL(bb) && b != end; >> + b = APR_BUCKET_NEXT(b)) >> + { >> + if (APR_BUCKET_IS_EOS(b)) { >> + return 1; >> + } >> + } >> } >> return 0; >> } > > Regards, > Yann.