diff --git a/.gitattributes b/.gitattributes index c506618ef190528650e050b9837535ca1b8f02c8..45046235ef3dc88e5794c90ce4c265b8bb37b1bf 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 d7fa2dabe649d6085622ed4d7f224d4aa9afb8b0..30621c0831df5057c10d7091359bebcb98f5e696 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,