From 51a0e47ecf12c8d08a70a212648fc19127169837 Mon Sep 17 00:00:00 2001 From: Oknet Xu Date: Fri, 23 Dec 2016 13:06:22 +0800 Subject: [PATCH] TS-5105: Do vc->con.setRemote(target) before socksEntry->init() (cherry picked from commit 25140ce7b2d2d8214bbc22dde6a2db9144ff2693) --- iocore/net/Socks.cc | 5 +++-- iocore/net/UnixNetProcessor.cc | 5 +++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/iocore/net/Socks.cc b/iocore/net/Socks.cc index d8ca123ef6e..43d91b9b518 100644 --- a/iocore/net/Socks.cc +++ b/iocore/net/Socks.cc @@ -56,7 +56,8 @@ SocksEntry::init(ProxyMutex *m, SocksNetVC *vc, unsigned char socks_support, uns SET_HANDLER(&SocksEntry::startEvent); - ats_ip_copy(&target_addr, vc->get_remote_addr()); + // Save the original server_addr as target_addr to initial a socks request. + ats_ip_copy(&target_addr, vc->server_addr); #ifdef SOCKS_WITH_TS req_data.hdr = 0; @@ -248,7 +249,7 @@ SocksEntry::mainEvent(int event, void *data) p[n_bytes++] = version; p[n_bytes++] = (socks_cmd == NORMAL_SOCKS) ? SOCKS_CONNECT : socks_cmd; - ts = ntohs(ats_ip_port_cast(&target_addr)); + ts = ats_ip_port_cast(&target_addr); if (version == SOCKS5_VERSION) { p[n_bytes++] = 0; // Reserved diff --git a/iocore/net/UnixNetProcessor.cc b/iocore/net/UnixNetProcessor.cc index 521148e033e..d2b10ec181d 100644 --- a/iocore/net/UnixNetProcessor.cc +++ b/iocore/net/UnixNetProcessor.cc @@ -233,6 +233,8 @@ UnixNetProcessor::connect_re_internal(Continuation *cont, sockaddr const *target char buff[INET6_ADDRPORTSTRLEN]; Debug("Socks", "Using Socks ip: %s\n", ats_ip_nptop(target, buff, sizeof(buff))); socksEntry = socksAllocator.alloc(); + // The socksEntry->init() will get the origin server addr by vc->server_addr + // and save it to socksEntry->req_data.dest_ip. socksEntry->init(cont->mutex, vc, opt->socks_support, opt->socks_version); /*XXXX remove last two args */ socksEntry->action_ = cont; cont = socksEntry; @@ -241,6 +243,9 @@ UnixNetProcessor::connect_re_internal(Continuation *cont, sockaddr const *target socksEntry->free(); return ACTION_RESULT_DONE; } + // At the end of socksEntry->init(), a socks server will be selected and saved to socksEntry->server_addr. + // Therefore, we should override the vc->server_addr by socksEntry->server_addr in order to establish a connection + // with the socks server. ats_ip_copy(&vc->server_addr, &socksEntry->server_addr); result = &socksEntry->action_; vc->action_ = socksEntry;