Resolve parent hostname before connection

This commit is contained in:
Vladimir Dubrovin 2026-09-16 16:00:07 +03:00
parent b8e5853b6b
commit 2dc4a422c5

View File

@ -273,6 +273,22 @@ void applyportranges(struct clientparam * param, struct ace * acentry){
} }
} }
static void chainaddr(struct chain * cur, PROXYSOCKADDRTYPE * sa){
PROXYSOCKADDRTYPE fresh;
*sa = cur->addr;
if(resolvfunc != myresolver) return;
if(!cur->exthost || SAISNULL(&cur->addr)) return;
#ifdef WITH_UN
if(*SAFAMILY(&cur->addr) == AF_UNIX) return;
#endif
if(afdetect(cur->exthost) != -1) return;
memset(&fresh, 0, sizeof(fresh));
if(!getip46(46, cur->exthost, (struct sockaddr *)&fresh)) return;
*SAPORT(&fresh) = *SAPORT(&cur->addr);
*sa = fresh;
}
int handleredirect(struct clientparam * param, struct ace * acentry){ int handleredirect(struct clientparam * param, struct ace * acentry){
int connected = 0; int connected = 0;
int weight = 1000; int weight = 1000;
@ -365,12 +381,12 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
} }
else if(!*SAPORT(&cur->addr) && !SAISNULL(&cur->addr)) { else if(!*SAPORT(&cur->addr) && !SAISNULL(&cur->addr)) {
uint16_t port = *SAPORT(&param->sinsr); uint16_t port = *SAPORT(&param->sinsr);
param->sinsr = cur->addr; chainaddr(cur, &param->sinsr);
*SAPORT(&param->sinsr) = port; *SAPORT(&param->sinsr) = port;
} }
else if(SAISNULL(&cur->addr) && *SAPORT(&cur->addr)) *SAPORT(&param->sinsr) = *SAPORT(&cur->addr); else if(SAISNULL(&cur->addr) && *SAPORT(&cur->addr)) *SAPORT(&param->sinsr) = *SAPORT(&cur->addr);
else { else {
param->sinsr = cur->addr; chainaddr(cur, &param->sinsr);
} }
if(param->operation == UDPASSOC){ if(param->operation == UDPASSOC){
SOCKET s; SOCKET s;
@ -400,7 +416,10 @@ int handleredirect(struct clientparam * param, struct ace * acentry){
} }
} }
else { else {
res = (redir)?clientnegotiate(redir, param, (struct sockaddr *)&cur->addr, cur->exthost):0; PROXYSOCKADDRTYPE next;
chainaddr(cur, &next);
res = (redir)?clientnegotiate(redir, param, (struct sockaddr *)&next, cur->exthost):0;
if(res) return res; if(res) return res;
} }
redir = cur; redir = cur;