aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2009-05-26 21:59:28 +0100
committerMatthew Wild <mwild1@gmail.com>2009-05-26 21:59:28 +0100
commit0172110483d17ebc356f031fc52b8f1f5b269081 (patch)
tree5d306020b42d1a621bf22f1e4295a3a648255d80
parentd2197f6ca335ee102665743a4efa157bf5b2dfa9 (diff)
downloadprosody-0172110483d17ebc356f031fc52b8f1f5b269081.tar.gz
prosody-0172110483d17ebc356f031fc52b8f1f5b269081.zip
s2smanager: Timeout DNS requests after 60 seconds (or dns_timeout in config)
-rw-r--r--core/s2smanager.lua16
1 files changed, 14 insertions, 2 deletions
diff --git a/core/s2smanager.lua b/core/s2smanager.lua
index e9589340..386e0794 100644
--- a/core/s2smanager.lua
+++ b/core/s2smanager.lua
@@ -11,6 +11,7 @@
local hosts = hosts;
local sessions = sessions;
local core_process_stanza = function(a, b) core_process_stanza(a, b); end
+local add_task = require "util.timer".add_task;
local socket = require "socket";
local format = string.format;
local t_insert, t_sort = table.insert, table.sort;
@@ -38,6 +39,8 @@ local dialback_secret = sha256_hash(tostring{} .. math.random() .. socket.gettim
local adns = require "net.adns";
+local dns_timeout = config.get("*", "core", "dns_timeout") or 60;
+
incoming_s2s = {};
local incoming_s2s = incoming_s2s;
@@ -169,8 +172,9 @@ function attempt_connection(host_session, err)
if not err then -- This is our first attempt
log("debug", "First attempt to connect to %s, starting with SRV lookup...", to_host);
host_session.connecting = true;
- local answer =
- adns.lookup(function (answer)
+ local answer, handle;
+ handle = adns.lookup(function (answer)
+ handle = nil;
host_session.connecting = nil;
if answer then
log("debug", to_host.." has SRV records, handling...");
@@ -193,6 +197,14 @@ function attempt_connection(host_session, err)
-- Try with SRV, or just the plain hostname if no SRV
return try_connect(host_session, connect_host, connect_port);
end, "_xmpp-server._tcp."..connect_host..".", "SRV");
+
+ -- Set handler for DNS timeout
+ add_task(dns_timeout, function ()
+ if handle then
+ adns.cancel(handle, true);
+ end
+ end);
+
log("debug", "DNS lookup for %s sent, waiting for response before we can connect", to_host);
return true; -- Attempt in progress
elseif host_session.srv_hosts and #host_session.srv_hosts > host_session.srv_choice then -- Not our first attempt, and we also have SRV