From dfee08ded423fa354681411e11c18a98db5f47b0 Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Thu, 15 Oct 2026 00:49:53 +0300 Subject: [PATCH] Authorize FTP commands and data connections by the rules in force An FTP control connection authorizes each OPEN or USER and each data connection while it lasts, which may be across a reload: these go through clientauth() too, as a client of the newest service on its listener after a reload. Co-Authored-By: Claude Opus 5.5 --- src/ftp.c | 4 ++-- src/ftppr.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ftp.c b/src/ftp.c index d3b3d5c..29c970e 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -203,13 +203,13 @@ SOCKET ftpdata(struct clientparam *param){ *SAPORT(¶m->sinsl) = 0; i = param->operation; param->operation = FTP_DATA; - if((param->res = (*param->srv->authfunc)(param))) { + if((param->res = clientauth(param))) { if(param->remsock != INVALID_SOCKET) { param->srv->so._closesocket(param->sostate, param->remsock); param->remsock = INVALID_SOCKET; } memset(¶m->sinsl, 0, sizeof(param->sinsl)); - if((param->res = (*param->srv->authfunc)(param))) { + if((param->res = clientauth(param))) { param->remsock = rem; return INVALID_SOCKET; } diff --git a/src/ftppr.c b/src/ftppr.c index 52ae032..486de53 100644 --- a/src/ftppr.c +++ b/src/ftppr.c @@ -54,7 +54,7 @@ void * ftpprchild(struct clientparam* param) { param->srv->so._closesocket(param->sostate, param->remsock); param->remsock = INVALID_SOCKET; } - if((res = (*param->srv->authfunc)(param))) {RETURN(res);} + if((res = clientauth(param))) {RETURN(res);} param->ctrlsocksrv = param->remsock; if(socksend(param, param->ctrlsock, (unsigned char *)"220 Ready\r\n", 11, param->srv->timeouts[STRING_S])!=11) {RETURN (801);} status = 1; @@ -62,7 +62,7 @@ void * ftpprchild(struct clientparam* param) { else if (!strncasecmp((char *)buf, "USER ", 5)){ if(parseconnusername((char *)buf +5, param, 0, 21)){RETURN(804);} if(!status){ - if((res = (*param->srv->authfunc)(param))) {RETURN(res);} + if((res = clientauth(param))) {RETURN(res);} param->ctrlsocksrv = param->remsock; } if(socksend(param, param->ctrlsock, (unsigned char *)"331 ok\r\n", 8, param->srv->timeouts[STRING_S])!=8) {RETURN (807);}