From: John Tsiombikas Date: Sun, 22 Jan 2023 17:51:30 +0000 (+0200) Subject: fixed bug in line-buffered receive routine X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=commitdiff_plain;h=44494b046145941d3bed279e0046cb0ef9279669;hp=e0c59f7f4ddb73390dc9c16569254c0e2a921931;p=oftp fixed bug in line-buffered receive routine --- diff --git a/src/ftp.c b/src/ftp.c index 806c766..ec6dbab 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -353,7 +353,13 @@ static int handle_control(struct ftp *ftp) int i, sz, rd; char *buf, *start, *end; - while((sz = sizeof ftp->crecv - ftp->num_crecv) > 0) { + for(;;) { + if((sz = sizeof ftp->crecv - ftp->num_crecv) <= 0) { + /* discard buffer */ + warnmsg("discard buffer\n"); + sz = sizeof ftp->crecv; + ftp->num_crecv = 0; + } start = ftp->crecv + ftp->num_crecv; if((rd = recv(ftp->ctl, start, sz, 0)) == -1) { if(errno == EINTR) continue; @@ -368,7 +374,9 @@ static int handle_control(struct ftp *ftp) end = start + rd; buf = ftp->crecv; for(i=0; icrecv && buf < end) { ftp->num_crecv = end - buf; memmove(ftp->crecv, buf, ftp->num_crecv); + } else { + ftp->num_crecv = 0; } } return 0; @@ -460,6 +470,7 @@ static void proc_control(struct ftp *ftp, const char *buf) } return; } + ftp->busy = 0; switch(code) { case 220: @@ -479,7 +490,6 @@ static void proc_control(struct ftp *ftp, const char *buf) errmsg("login failed\n"); break; } - ftp->busy = 0; } static int newconn(struct ftp *ftp)