Hi

Attached you'll find the NMU patch.

Cheers
Steffen
diff -u pan-0.132/debian/changelog pan-0.132/debian/changelog
--- pan-0.132/debian/changelog
+++ pan-0.132/debian/changelog
@@ -1,3 +1,12 @@
+pan (0.132-3.1) unstable; urgency=high
+
+  * Non-maintainer upload by the security team
+  * Fix possible buffer overflow by clearing parts from PartsBatch
+    class (Closes: #483562)
+    Fixes: CVE-2008-2363
+
+ -- Steffen Joeris <[EMAIL PROTECTED]>  Sun, 01 Jun 2008 11:55:25 +0000
+
 pan (0.132-3) unstable; urgency=low
 
   * Fix FTBFS with moved glib header. (closes: #471629)
diff -u pan-0.132/debian/patches/00list pan-0.132/debian/patches/00list
--- pan-0.132/debian/patches/00list
+++ pan-0.132/debian/patches/00list
@@ -4,0 +5 @@
+CVE-2008-2363.dpatch
only in patch2:
unchanged:
--- pan-0.132.orig/debian/patches/CVE-2008-2363.dpatch
+++ pan-0.132/debian/patches/CVE-2008-2363.dpatch
@@ -0,0 +1,95 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## CVE-2008-2363.dpatch
+##
+## DP: Fix buffer overflow
+
[EMAIL PROTECTED]@
+--- pan-0.132.inc/pan/data/parts.cc	2007-08-01 13:00:01.000000000 -0400
++++ pan-0.132/pan/data/parts.cc	2008-05-27 22:27:03.000000000 -0400
+@@ -303,8 +303,7 @@
+   this->n_parts_total = n_parts_total;
+   this->n_parts_found = 0; // they haven't been added yet
+ 
+-  if (n_parts_found > parts.size())
+-    parts.resize (n_parts_found);
++  parts.clear();
+ }
+ 
+ void
+@@ -312,21 +311,10 @@
+                        const StringView  & mid,
+                        bytes_t             bytes)
+ {
+-  if (n_parts_found >= parts.size())
+-    parts.resize (n_parts_found+1);
+-
+-  Part& p = *(&parts.front() + n_parts_found++);
+-  p.number = number;
+-  p.bytes = bytes;
+ 
+   Packer packer;
+   pack_message_id (packer, mid, reference_mid);
+-  p.len_used = packer.size ();
+-  if (p.len_alloced < p.len_used) {
+-    delete [] p.packed_mid;
+-    p.packed_mid = new char [p.len_used];
+-    p.len_alloced = p.len_used;
+-  }
++  Part p(number,bytes,packer.size());
+   packer.pack (p.packed_mid);
+   packed_mids_len += p.len_used;
+ 
+@@ -337,8 +325,9 @@
+   assert (mid == tmp);
+ #endif
+ 
+-  if (n_parts_total < n_parts_found)
++  if (n_parts_total < ++n_parts_found)
+       n_parts_total = n_parts_found;
++  parts.push_back(p);
+ }
+ 
+ PartBatch :: Part&
+@@ -346,7 +335,7 @@
+ {
+   number =  that.number;
+   bytes =  that.bytes;
+-  len_used = len_alloced = that.len_used;
++  len_used = that.len_used;
+   delete [] packed_mid;
+   packed_mid = new char [len_used];
+   memcpy (packed_mid, that.packed_mid, len_used);
+@@ -357,11 +346,17 @@
+   number (that.number),
+   bytes (that.bytes),
+   len_used (that.len_used),
+-  len_alloced (that.len_used),
+   packed_mid (new char [len_used])
+ {
+   memcpy (packed_mid, that.packed_mid, len_used);
+ }
++PartBatch :: Part :: Part (number_t n, bytes_t b, size_t l):
++    number(n),
++    bytes(b),
++    len_used(l),
++    packed_mid(new char [len_used])
++{
++}
+ 
+ void
+ PartBatch :: sort (void)
+--- pan-0.132.inc/pan/data/parts.h	2007-08-01 13:00:01.000000000 -0400
++++ pan-0.132/pan/data/parts.h	2008-05-27 22:27:03.000000000 -0400
+@@ -141,10 +141,10 @@
+         number_t number;
+         bytes_t bytes;
+         size_t len_used;
+-        size_t len_alloced;
+         char * packed_mid;
+         Part(): number(0), bytes(0),
+-                len_used(0), len_alloced(0), packed_mid(0) {}
++                len_used(0), packed_mid(0) {}
++        Part(number_t n, bytes_t b, size_t l);
+         ~Part() { delete [] packed_mid; }
+         Part (const Part&);
+         Part& operator= (const Part&);

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to