Paul Reder wrote:

>
> Sorry for the lack of timeliness on responding to this. Our mailserver 
> has been
>  about to be back up any minute now for a couple of days.
>
> The test case that I ran was even more brutal than what your test 
> module does.
> Basically I have a small piece of code that puts each byte in its own 
> bucket and
> each bucket in its own brigade.
>
> Brian's patch will not handle this case because there is no next 
> bucket to point
> tag_start_index at


The next bucket in this case is the brigade sentinel, which
is the same thing that send_parsed_content() would choose as
the next bucket to scan if we escaped from find_start_sequence()
with tag_start_index==NULL.

> I was a little vague in my description of the problem. Basically,
> if the <!--# tag occurs at the end of one brigade and the directive 
> starts at the
> beginning of the next brigade we have trouble. In my tests this was 
> causing a
> core dump which my patch fixed.
>
> I'm also surprised that the include virtual was failing since it 
> passed my tests. :(
> I'll double check those results to see if I missed something.
>
> Also, Brian, I do not see where the comment you removed was invalid. 
> Slen is only
> ever set to ctx->start_seq_len (which by default is 5 I believe). Slen 
> is never changed
> to be any number other than ctx->start_seq_len.
>
> I do not claim to have studied bndm enough to be certain, but it seems 
> to me that
> if the brigade has a single bucket with a single byte which hapens to 
> match within
> the pattern then you will end up incrementing ctx->bytes_parsed by 
> pos+slen (where
> slen == 5) when only one byte was processed.


bndm will only match on an instance of the complete pattern within
the current bucket.  If slen==5 and len==1, bndm won't find a match.
All the one-byte-at-a-time scanning code in find_start_sequence()
exists solely to catch the boundary cases where the pattern spans
two or more buckets--the cases that bndm won't detect.  So when bndm
finds a match, it's guaranteed that len >= slen.

If len==1 and bndm indicates that it's found a pattern, it can
only mean that the pattern has been changed from "<!--#" to some
single-byte token.  This case *is* possible, now that we support
the SSIStartTag directive.  But the logic for incrementing
ctx->bytes_parsed by pos+slen is still correct; pos+slen==1.

--Brian


Reply via email to