From fe37229f7cf1b90c146aa5b970006ebe7f4291fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Fri, 30 Oct 2020 12:21:38 +0100 Subject: [PATCH] Protocols.DNS: Improved error handling when calling async callbacks. Do not complain if the originator for an asynchronous request has gone away. Do not output a misleading message about failing to read the UDP packet or connection refused, if it is the user callback that fails. Fixes #10057. --- .gitattributes | 1 - lib/modules/Protocols.pmod/DNS.pmod | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.gitattributes b/.gitattributes index c506618ef1..45046235ef 100644 --- a/.gitattributes +++ b/.gitattributes @@ -141,7 +141,6 @@ testfont binary /lib/modules/Parser.pmod/module.pmod foreign_ident /lib/modules/Pike.pmod foreign_ident /lib/modules/Pike.pmod/module.pmod foreign_ident -/lib/modules/Protocols.pmod/DNS.pmod foreign_ident /lib/modules/Protocols.pmod/HTTP.pmod/Query.pike foreign_ident /lib/modules/Protocols.pmod/HTTP.pmod/Session.pike foreign_ident /lib/modules/Protocols.pmod/IMAP.pmod/imap_server.pike foreign_ident diff --git a/lib/modules/Protocols.pmod/DNS.pmod b/lib/modules/Protocols.pmod/DNS.pmod index d7fa2dabe6..30621c0831 100644 --- a/lib/modules/Protocols.pmod/DNS.pmod +++ b/lib/modules/Protocols.pmod/DNS.pmod @@ -1,4 +1,4 @@ -// $Id: DNS.pmod,v 1.81 2003/10/21 03:10:39 nilsson Exp $ +// $Id$ // Not yet finished -- Fredrik Hubinette //! Domain Name System @@ -1132,18 +1132,28 @@ class async_client static private void rec_data(mapping m) { mixed err; + mapping res; if (err = catch { if(m->port != 53 || !has_value(nameservers, m->ip)) return; sscanf(m->data,"%2c",int id); object r=requests[id]; if(!r) return; m_delete(requests,id); - r->callback(r->domain,decode_res(m->data),@r->args); - destruct(r); + res = decode_res(m->data); }) { werror("DNS: Failed to read UDP packet. Connection refused?\n%s\n", describe_backtrace(err)); } + // NB: The callback may have gone away during our processing. + // Don't complain if that is the case. + if (r->callback && (err = catch { + r->callback(r->domain, res, @r->args); + })) { + werror("DNS: Callback failed:\n" + "%s\n", + describe_backtrace(err)); + } + destruct(r); } static private void generic_get(string d, -- GitLab