Don't terminate connection on datagram sending issue in SOCKSv5 UDP ASSOCIATE

This commit is contained in:
z3APA3A 2020-08-08 13:56:34 +03:00
parent 1fd759d327
commit 1075370594

View File

@ -208,7 +208,7 @@ void * sockschild(struct clientparam* param) {
*SAPORT(&param->sinsl) = 0; *SAPORT(&param->sinsl) = 0;
if(so._bind(param->remsock,(struct sockaddr *)&param->sinsl,SASIZE(&param->sinsl)))RETURN (12); if(so._bind(param->remsock,(struct sockaddr *)&param->sinsl,SASIZE(&param->sinsl)))RETURN (12);
#if SOCKSTRACE > 0 #if SOCKSTRACE > 0
fprintf(stderr, "%hu binded to communicate with server\n", *SAPORT(&param->sins)); fprintf(stderr, "%hu bound to communicate with server\n", *SAPORT(&param->sins));
fflush(stderr); fflush(stderr);
#endif #endif
} }
@ -331,6 +331,7 @@ fflush(stderr);
param->sinsr = param->req; param->sinsr = param->req;
myfree(buf); myfree(buf);
if(!(buf = myalloc(LARGEBUFSIZE))) {RETURN(21);} if(!(buf = myalloc(LARGEBUFSIZE))) {RETURN(21);}
sin = param->sincr;
for(;;){ for(;;){
fds[0].fd = param->remsock; fds[0].fd = param->remsock;
@ -387,10 +388,7 @@ fflush(stderr);
sasize = sizeof(param->sinsr); sasize = sizeof(param->sinsr);
if(len > (int)i){ if(len > (int)i){
if(socksendto(param->remsock, (struct sockaddr *)&param->sinsr, buf+i, len - i, conf.timeouts[SINGLEBYTE_L]*1000) <= 0){ socksendto(param->remsock, (struct sockaddr *)&param->sinsr, buf+i, len - i, conf.timeouts[SINGLEBYTE_L]*1000);
param->res = 467;
break;
}
param->statscli64+=(len - i); param->statscli64+=(len - i);
param->nwrites++; param->nwrites++;
#if SOCKSTRACE > 1 #if SOCKSTRACE > 1
@ -413,7 +411,7 @@ fflush(stderr);
sasize = sizeof(param->sinsr); sasize = sizeof(param->sinsr);
buf[0]=buf[1]=buf[2]=0; buf[0]=buf[1]=buf[2]=0;
buf[3]=(*SAFAMILY(&param->sinsl) == AF_INET)?1:4; buf[3]=(*SAFAMILY(&param->sinsl) == AF_INET)?1:4;
if((len = so._recvfrom(param->remsock, (char *)buf+6+SAADDRLEN(&param->sinsl), 65535 - 10, 0, (struct sockaddr *)&param->sinsr, &sasize)) <= 0) { if((len = so._recvfrom(param->remsock, (char *)buf+6+SAADDRLEN(&param->sinsl), 65535 - (6+SAADDRLEN(&param->sinsl)), 0, (struct sockaddr *)&param->sinsr, &sasize)) <= 0) {
param->res = 468; param->res = 468;
break; break;
} }
@ -422,10 +420,7 @@ fflush(stderr);
memcpy(buf+4, SAADDR(&param->sinsr), SAADDRLEN(&param->sinsr)); memcpy(buf+4, SAADDR(&param->sinsr), SAADDRLEN(&param->sinsr));
memcpy(buf+4+SAADDRLEN(&param->sinsr), SAPORT(&param->sinsr), 2); memcpy(buf+4+SAADDRLEN(&param->sinsr), SAPORT(&param->sinsr), 2);
sasize = sizeof(sin); sasize = sizeof(sin);
if(socksendto(param->clisock, (struct sockaddr *)&sin, buf, len + 6 + SAADDRLEN(&param->sinsr), conf.timeouts[SINGLEBYTE_L]*1000) <=0){ socksendto(param->clisock, (struct sockaddr *)&sin, buf, len + 6 + SAADDRLEN(&param->sinsr), conf.timeouts[SINGLEBYTE_L]*1000);
param->res = 469;
break;
}
#if SOCKSTRACE > 1 #if SOCKSTRACE > 1
fprintf(stderr, "UDP packet relayed to client from %hu size %d\n", fprintf(stderr, "UDP packet relayed to client from %hu size %d\n",
ntohs(*SAPORT(&param->sinsr)), ntohs(*SAPORT(&param->sinsr)),