[MPlayer-dev-eng] [PATCHv2 3/8] stream ftp: readline: Always try to read complete lines
Alexander Strasser
eclipse7 at gmx.net
Sun Nov 18 22:07:45 CET 2012
Hi Reimar!
Reimar Döffinger wrote:
> On Sat, Nov 17, 2012 at 01:01:58AM +0100, Alexander Strasser wrote:
> > @@ -144,8 +149,20 @@ static int readline(char *buf,int max,struct stream_priv_s *ctl)
> > }
> > }
> > if (max == 1) {
> > - *buf = '\0';
> > - break;
> > + int found_eol = 0;
> > +
> > + while (ctl->cavail > 0) { // skip remaining response line
> > + found_eol = *ctl->cget == '\n';
> > + --ctl->cavail; ++ctl->cget;
> > +
> > + if (found_eol) {
> > + break;
> > + }
> > + }
> > +
> > + if (found_eol) {
> > + break;
> > + }
>
> I find this code quite non-obvious.
I am glad you had a look at this. I somewhat disliked the double break...
> Maybe instead
> char *eol = memchr(ctl->cget, ctl->cavail);
> if (eol) {
> eol++;
> ctl->cavail -= eol - ctl->cget;
> ctl->cget = eol;
> break;
> }
> // read more data to find end of current line
I replaced the code now with this:
--8<--
char *q = memchr(ctl->cget, '\n', ctl->cavail);
if (q) { // found EOL: update state and return
++q;
ctl->cavail -= q - ctl->cget;
ctl->cget = q;
break;
}
// receive more data to find end of current line
ctl->cget = ctl->cput;
-->8--
> I also wonder if we should do something against the
> possibility that a hacked server could keep us in the
> loop forever...
Having a limit on how many bytes to look with one call of
readline() might be a good idea. I will try to come up with
something!
[...]
Alexander
More information about the MPlayer-dev-eng
mailing list