Browse Source

Add timeout for connect in all modules

z3APA3A 9 years ago
parent
commit
e2884b182a
6 changed files with 28 additions and 19 deletions
  1. 1 1
      src/auth.c
  2. 23 15
      src/common.c
  3. 1 1
      src/dnspr.c
  4. 1 1
      src/ftppr.c
  5. 1 0
      src/proxy.h
  6. 1 1
      src/proxymain.c

+ 1 - 1
src/auth.c

@@ -1090,7 +1090,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
 			*sinsr = nservers[i].addr;
 		}
 		if(usetcp){
-			if(so._connect(sock,(struct sockaddr *)sinsr,SASIZE(sinsr))) {
+			if(connectwithpoll(sock,(struct sockaddr *)sinsr,SASIZE(sinsr))) {
 				so._shutdown(sock, SHUT_RDWR);
 				so._closesocket(sock);
 				break;

+ 23 - 15
src/common.c

@@ -648,6 +648,27 @@ void logsyslog(struct clientparam * param, const unsigned char *s) {
 }
 #endif
 
+int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size){
+		struct pollfd fds[1];
+#ifdef _WIN32
+		unsigned long ul = 1;
+		ioctlsocket(sock, FIONBIO, &ul);
+#else
+		fcntl(sock,F_SETFL,O_NONBLOCK);
+#endif
+		if(so._connect(sock,sa,size)) {
+			if(errno != EAGAIN && errno != EINPROGRESS) return (13);
+		}
+	        memset(fds, 0, sizeof(fds));
+	        fds[0].fd = sock;
+	        fds[0].events = POLLOUT;
+		if(so._poll(fds, 1, conf.timeouts[STRING_S]*1000) <= 0) {
+			return (13);
+		}
+		return 0;
+}
+
+
 int doconnect(struct clientparam * param){
  SASIZETYPE size;
 
@@ -702,21 +723,8 @@ int doconnect(struct clientparam * param){
 	}
 	
 	if(param->operation >= 256 || (param->operation & CONNECT)){
-		struct pollfd fds[1];
-#ifdef _WIN32
-		unsigned long ul = 1;
-		ioctlsocket(param->remsock, FIONBIO, &ul);
-#else
-		fcntl(param->remsock,F_SETFL,O_NONBLOCK);
-#endif
-		if(so._connect(param->remsock,(struct sockaddr *)&param->sinsr,SASIZE(&param->sinsr))) {
-			if(errno != EAGAIN && errno != EINPROGRESS) return (13);
-		}
-	        memset(fds, 0, sizeof(fds));
-	        fds[0].fd = param->remsock;
-	        fds[0].events = POLLOUT;
-		if(so._poll(fds, 1, conf.timeouts[STRING_S]*1000) <= 0) {
-			return (13);
+		if(connectwithpoll(param->remsock,(struct sockaddr *)&param->sinsr,SASIZE(&param->sinsr))) {
+			return 13;
 		}
 	}
 	size = sizeof(param->sinsl);

+ 1 - 1
src/dnspr.c

@@ -140,7 +140,7 @@ void * dnsprchild(struct clientparam* param) {
 	}
 	param->sinsr = nservers[0].addr;
 	if(nservers[0].usetcp) {
-		if(so._connect(param->remsock,(struct sockaddr *)&param->sinsr,SASIZE(&param->sinsr))) RETURN(830);
+		if(connectwithpoll(param->remsock,(struct sockaddr *)&param->sinsr,SASIZE(&param->sinsr))) RETURN(830);
 		buf-=2;
 		*(unsigned short*)buf = htons(i);
 		i+=2;

+ 1 - 1
src/ftppr.c

@@ -145,7 +145,7 @@ void * ftpprchild(struct clientparam* param) {
 
 			if(sscanf((char *)buf+5, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) {RETURN(828);}
 			*SAPORT(&param->sincr) = htons((unsigned short)((b5<<8)^b6));
-			if(so._connect(clidatasock, (struct sockaddr *)&param->sincr, SASIZE(&param->sincr))) {
+			if(connectwithpoll(clidatasock, (struct sockaddr *)&param->sincr, SASIZE(&param->sincr))) {
 				so._closesocket(clidatasock);
 				clidatasock = INVALID_SOCKET;
 				RETURN(826);

+ 1 - 0
src/proxy.h

@@ -270,6 +270,7 @@ void srvinit2(struct srvparam * srv, struct clientparam *param);
 void srvfree(struct srvparam * srv);
 unsigned char * dologname (unsigned char *buf, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t);
 int readconfig(FILE * fp);
+int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size);
 
 
 int myrand(void * entropy, int len);

+ 1 - 1
src/proxymain.c

@@ -553,7 +553,7 @@ int MODULEMAINFUNC (int argc, char** argv){
 			new_sock=so._socket(SASOCK(&defparam.sincr), SOCK_STREAM, IPPROTO_TCP);
 			if(new_sock != INVALID_SOCKET){
 				parsehost(srv.family, cbc_string, (struct sockaddr *)&defparam.sincr);
-				if(so._connect(new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr))) {
+				if(connectwithpoll(new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr))) {
 					so._closesocket(new_sock);
 					new_sock = INVALID_SOCKET;
 					usleep(SLEEPTIME);