From c98621aeefee7684f5905d6e369117243f600017 Mon Sep 17 00:00:00 2001 From: Vladimir Dubrovin <3proxy@3proxy.ru> Date: Wed, 29 Jun 2022 10:35:17 +0300 Subject: [PATCH] Always select between IPV6_BOUND_IF and IP_BOUND_IF --- src/common.c | 20 ++++++++++---------- src/proxymain.c | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/common.c b/src/common.c index 2acd64d..81839fe 100644 --- a/src/common.c +++ b/src/common.c @@ -414,6 +414,14 @@ int doconnect(struct clientparam * param){ } if(!*SAPORT(¶m->sinsr))*SAPORT(¶m->sinsr) = *SAPORT(¶m->req); if ((param->remsock=so._socket(SASOCK(¶m->sinsr), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);} + if(SAISNULL(¶m->sinsl)){ +#ifndef NOIPV6 + if(*SAFAMILY(¶m->sinsr) == AF_INET6) param->sinsl = param->srv->extsa6; + else +#endif + param->sinsl = param->srv->extsa; + } + *SAPORT(¶m->sinsl) = 0; setopts(param->remsock, param->srv->srvsockopts); so._setsockopt(param->remsock, SOL_SOCKET, SO_LINGER, (char *)&lg, sizeof(lg)); @@ -440,21 +448,13 @@ int doconnect(struct clientparam * param){ if(param->srv->obindtodevice) { int idx; idx = if_nametoindex(param->srv->obindtodevice); - if(!idx || so._setsockopt(param->remsock, IPPROTO_IP, IP_BOUND_IF, &idx, sizeof(idx))) + if(!idx || (*SAFAMILY(¶m->sinsl) == AF_INET && so._setsockopt(param->remsock, IPPROTO_IP, IP_BOUND_IF, &idx, sizeof(idx)))) return 12; #ifndef NOIPV6 - if(param->srv->family != 4 && so._setsockopt(param->remsock, IPPROTO_IPV6, IPV6_BOUND_IF, &idx, sizeof(idx))) return 12; + if(*SAFAMILY(¶m->sinsl) == AF_INET6 && so._setsockopt(param->remsock, IPPROTO_IPV6, IPV6_BOUND_IF, &idx, sizeof(idx))) return 12; #endif } #endif - if(SAISNULL(¶m->sinsl)){ -#ifndef NOIPV6 - if(*SAFAMILY(¶m->sinsr) == AF_INET6) param->sinsl = param->srv->extsa6; - else -#endif - param->sinsl = param->srv->extsa; - } - *SAPORT(¶m->sinsl) = 0; if(so._bind(param->remsock, (struct sockaddr*)¶m->sinsl, SASIZE(¶m->sinsl))==-1) { return 12; } diff --git a/src/proxymain.c b/src/proxymain.c index 1534e11..d36c59c 100644 --- a/src/proxymain.c +++ b/src/proxymain.c @@ -619,12 +619,12 @@ int MODULEMAINFUNC (int argc, char** argv){ if(srv.ibindtodevice){ int idx; idx = if_nametoindex(srv.ibindtodevice); - if(!idx || setsockopt(sock, IPPROTO_IP, IP_BOUND_IF, &idx, sizeof(idx))) { + if(!idx || (*SAFAMILY(&srv.intsa) == AF_INET && setsockopt(sock, IPPROTO_IP, IP_BOUND_IF, &idx, sizeof(idx)))) { dolog(&defparam, (unsigned char *)"failed to bind device"); return -12; } #ifndef NOIPV6 - if(so._setsockopt(sock, IPPROTO_IPV6, IPV6_BOUND_IF, &idx, sizeof(idx))) { + if((*SAFAMILY(&srv.intsa) == AF_INET6 && so._setsockopt(sock, IPPROTO_IPV6, IPV6_BOUND_IF, &idx, sizeof(idx)))) { dolog(&defparam, (unsigned char *)"failed to bind device"); return -12; }