diff options
author | David Kalnischkies <david@kalnischkies.de> | 2017-06-28 22:56:27 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2017-06-29 01:23:59 +0200 |
commit | 9bdc09016f9570389451dd619d7e878bfeaa91df (patch) | |
tree | 48c3b09c3905578a76243edb4f75c260449a1edd /methods | |
parent | 579f8f1008eceecd3da9ac53923c6a8d08244cb7 (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.
Diffstat (limited to 'methods')
-rw-r--r-- | methods/connect.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/methods/connect.cc b/methods/connect.cc index 0103b5873..ae70e48ec 100644 --- a/methods/connect.cc +++ b/methods/connect.cc @@ -346,12 +346,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) { @@ -361,6 +364,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(); |