summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2017-06-28 22:56:27 +0200
committerJulian Andres Klode <jak@debian.org>2017-09-13 18:19:58 +0200
commit7bb1078178fdab4bf28a7973b35ca2b37f5eb484 (patch)
tree7e1703f62ae9eb4f6f590441cd9ac1f0f94031ba
parent19871a6dcbdd31884217ef2989c6080cb979acea (diff)
use port from SRV record instead of initial port
An SRV record includes a portnumber to use with the host given, but apt was ignoring the portnumber and instead used either the port given by the user for the initial host or the default port for the service. In practice the service usually runs on another host on the default port, so it tends to work as intended and even if not and apt can't get a connection there it will gracefully fallback to contacting the initial host with the right port, so its a user invisible bug most of the time. (cherry picked from commit 9bdc09016f9570389451dd619d7e878bfeaa91df)
-rw-r--r--methods/connect.cc6
1 files changed, 5 insertions, 1 deletions
diff --git a/methods/connect.cc b/methods/connect.cc
index c57e57bd4..311fb1af6 100644
--- a/methods/connect.cc
+++ b/methods/connect.cc
@@ -290,12 +290,15 @@ bool Connect(std::string Host,int Port,const char *Service,
size_t stackSize = 0;
// try to connect in the priority order of the srv records
std::string initialHost{std::move(Host)};
+ auto const initialPort = Port;
while(SrvRecords.empty() == false)
{
_error->PushToStack();
++stackSize;
// PopFromSrvRecs will also remove the server
- Host = PopFromSrvRecs(SrvRecords).target;
+ auto Srv = PopFromSrvRecs(SrvRecords);
+ Host = Srv.target;
+ Port = Srv.port;
auto const ret = ConnectToHostname(Host, Port, Service, DefPort, Fd, TimeOut, Owner);
if (ret)
{
@@ -305,6 +308,7 @@ bool Connect(std::string Host,int Port,const char *Service,
}
}
Host = std::move(initialHost);
+ Port = initialPort;
// we have no (good) SrvRecords for this host, connect right away
_error->PushToStack();