Index: /trunk/pdns/pdns/dnswriter.hh
===================================================================
--- /trunk/pdns/pdns/dnswriter.hh	(revision 2021)
+++ /trunk/pdns/pdns/dnswriter.hh	(revision 2150)
@@ -62,5 +62,5 @@
   void commit();
 
-  uint16_t size();
+  uint32_t size(); // needs to be 32 bit because otherwise we don't see the wrap coming when it happened!
 
   /** Should the packet have grown too big for the writer's liking, rollback removes the record currently being written */
Index: /trunk/pdns/pdns/dnswriter.cc
===================================================================
--- /trunk/pdns/pdns/dnswriter.cc	(revision 2089)
+++ /trunk/pdns/pdns/dnswriter.cc	(revision 2150)
@@ -279,5 +279,5 @@
 }
 
-uint16_t DNSPacketWriter::size()
+uint32_t DNSPacketWriter::size()
 {
   return d_content.size() + d_stuff + d_record.size();
Index: /trunk/pdns/pdns/pdns_recursor.cc
===================================================================
--- /trunk/pdns/pdns/pdns_recursor.cc	(revision 2123)
+++ /trunk/pdns/pdns/pdns_recursor.cc	(revision 2150)
@@ -491,8 +491,8 @@
 
   try {
-    uint16_t maxudpsize=512;
+    uint32_t maxanswersize= dc->d_tcp ? 65535 : 512;
     EDNSOpts edo;
     if(getEDNSOpts(dc->d_mdp, &edo)) {
-      maxudpsize=max(edo.d_packetsize, (uint16_t)1280);
+      maxanswersize = min(edo.d_packetsize, (uint16_t) (dc->d_tcp ? 65535 : 1680));
     }
     
@@ -555,5 +555,5 @@
             drc->toPacket(pw);
           }
-          if(!dc->d_tcp && pw.size() > maxudpsize) {
+          if(pw.size() > maxanswersize) {
             pw.rollback();
             if(i->d_place==DNSResourceRecord::ANSWER)  // only truncate if we actually omitted parts of the answer
Index: /trunk/pdns/pdns/dnspacket.cc
===================================================================
--- /trunk/pdns/pdns/dnspacket.cc	(revision 2034)
+++ /trunk/pdns/pdns/dnspacket.cc	(revision 2150)
@@ -278,5 +278,5 @@
         shared_ptr<DNSRecordContent> drc(DNSRecordContent::mastermake(pos->qtype.getCode(), 1, pos->content)); 
               drc->toPacket(pw);
-        if(!d_tcp && pw.size() + 20U > getMaxReplyLen()) { // 20 = room for EDNS0
+        if(pw.size() + 20U > (d_tcp ? 65535 : getMaxReplyLen())) { // 20 = room for EDNS0
           pw.rollback();
           if(pos->d_place == DNSResourceRecord::ANSWER) {
