mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-23 10:35:40 +08:00
workaround for broken getsockname() in FTP proxy
This commit is contained in:
parent
ccbc94e06b
commit
8cdf341d0e
@ -694,8 +694,8 @@ int doconnect(struct clientparam * param){
|
|||||||
#else
|
#else
|
||||||
fcntl(param->remsock,F_SETFL,O_NONBLOCK);
|
fcntl(param->remsock,F_SETFL,O_NONBLOCK);
|
||||||
#endif
|
#endif
|
||||||
size = sizeof(param->sinsl);
|
|
||||||
}
|
}
|
||||||
|
size = sizeof(param->sinsl);
|
||||||
if(so._getsockname(param->remsock, (struct sockaddr *)¶m->sinsl, &size)==-1) {return (15);}
|
if(so._getsockname(param->remsock, (struct sockaddr *)¶m->sinsl, &size)==-1) {return (15);}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
17
src/ftp.c
17
src/ftp.c
@ -174,6 +174,7 @@ SOCKET ftpdata(struct clientparam *param){
|
|||||||
SOCKET s = INVALID_SOCKET, rem;
|
SOCKET s = INVALID_SOCKET, rem;
|
||||||
unsigned long b1, b2, b3, b4;
|
unsigned long b1, b2, b3, b4;
|
||||||
unsigned short b5, b6;
|
unsigned short b5, b6;
|
||||||
|
SASIZETYPE sasize;
|
||||||
|
|
||||||
if(socksend(param->remsock, (unsigned char *)"PASV\r\n", 6, conf.timeouts[STRING_S]) != 6){
|
if(socksend(param->remsock, (unsigned char *)"PASV\r\n", 6, conf.timeouts[STRING_S]) != 6){
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
@ -187,15 +188,27 @@ SOCKET ftpdata(struct clientparam *param){
|
|||||||
buf[i-2] = 0;
|
buf[i-2] = 0;
|
||||||
if(!(sb = strchr(buf+4, '(')) || !(se= strchr(sb, ')'))) return INVALID_SOCKET;
|
if(!(sb = strchr(buf+4, '(')) || !(se= strchr(sb, ')'))) return INVALID_SOCKET;
|
||||||
if(sscanf(sb+1, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) return INVALID_SOCKET;
|
if(sscanf(sb+1, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) return INVALID_SOCKET;
|
||||||
|
sasize = sizeof(param->sinsl);
|
||||||
|
if(so._getsockname(param->remsock, (struct sockaddr *)¶m->sinsl, &sasize)){return INVALID_SOCKET;}
|
||||||
|
sasize = sizeof(param->sinsr);
|
||||||
|
if(so._getpeername(param->remsock, (struct sockaddr *)¶m->sinsr, &sasize)){return INVALID_SOCKET;}
|
||||||
rem = param->remsock;
|
rem = param->remsock;
|
||||||
param->remsock = INVALID_SOCKET;
|
param->remsock = INVALID_SOCKET;
|
||||||
param->req = param->sinsr;
|
param->req = param->sinsr;
|
||||||
*SAPORT(¶m->req) = *SAPORT(¶m->sinsr) = htons((unsigned short)((b5<<8)^b6));
|
*SAPORT(¶m->req) = *SAPORT(¶m->sinsr) = htons((unsigned short)((b5<<8)^b6));
|
||||||
|
*SAPORT(¶m->sinsl) = 0;
|
||||||
i = param->operation;
|
i = param->operation;
|
||||||
param->operation = FTP_DATA;
|
param->operation = FTP_DATA;
|
||||||
if((param->res = (*param->srv->authfunc)(param))) {
|
if((param->res = (*param->srv->authfunc)(param))) {
|
||||||
param->remsock = rem;
|
if(param->remsock != INVALID_SOCKET) {
|
||||||
return INVALID_SOCKET;
|
so._closesocket(param->remsock);
|
||||||
|
param->remsock = INVALID_SOCKET;
|
||||||
|
}
|
||||||
|
memset(¶m->sinsl, 0, sizeof(param->sinsl));
|
||||||
|
if((param->res = (*param->srv->authfunc)(param))) {
|
||||||
|
param->remsock = rem;
|
||||||
|
return INVALID_SOCKET;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
param->operation = i;
|
param->operation = i;
|
||||||
s = param->remsock;
|
s = param->remsock;
|
||||||
|
Loading…
Reference in New Issue
Block a user