From 6aa4b73c463d026eb7608958ff24525a0b9cfaab Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?=
 <grubba@grubba.org>
Date: Sat, 13 Jun 1998 21:31:23 +0200
Subject: [PATCH] Made rec_data() more paranoid.

Rev: lib/modules/Protocols.pmod/DNS.pmod:1.16
---
 lib/modules/Protocols.pmod/DNS.pmod | 23 +++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git a/lib/modules/Protocols.pmod/DNS.pmod b/lib/modules/Protocols.pmod/DNS.pmod
index 42a560bdc5..dbca38c7e4 100644
--- a/lib/modules/Protocols.pmod/DNS.pmod
+++ b/lib/modules/Protocols.pmod/DNS.pmod
@@ -525,14 +525,21 @@ class async_client
 
   static private void rec_data()
   {
-    mapping m=udp::read();
-    if(m->port != 53 || search(nameservers, m->ip) == -1) 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);
+    mixed err;
+    if (err = catch {
+      mapping m=udp::read();
+      if(m->port != 53 || search(nameservers, m->ip) == -1) 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);
+    }) {
+      werror(sprintf("DNS: Failed to read UDP packet. Connection refused?\n"
+		     "%s\n",
+		     describe_backtrace(err)));
+    }
   }
 
   static private void generic_get(string d,
-- 
GitLab