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,