mirror of
				https://github.com/3proxy/3proxy.git
				synced 2025-11-04 15:52:39 +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