Attached is the patch to fix two release critical bugs in the Debian
freetype package:
#302269: fontconfig: Segmentation fault with certain bdf fonts
#305413: libfreetype6: Many packages which use freetype now segfault

I will make an NMU with this patch in a moment, since Anthony has been
inactive in maintaining the package and Martin Michlmayr told in
http://lists.debian.org/debian-devel/2005/03/msg00805.html that Anthony
had told him people should go ahead with adopting any of his packages.
I'm not ready to adopt this package, however.

diff -ruN orig/debian/changelog freetype-2.1.7/debian/changelog
--- orig/debian/changelog	2005-04-24 15:41:53.000000000 +0300
+++ freetype-2.1.7/debian/changelog	2005-04-24 16:02:24.000000000 +0300
@@ -1,3 +1,25 @@
+freetype (2.1.7-2.4) unstable; urgency=high
+
+  * Non-maintainer upload.
+  * freetype-2.1.7/src/bdf/bdflib.c: When a glyph has zero width or height,
+    a bitmap is not actually allocated for it, but the code used to try to
+    use it anyway. Now it no longer does that. Fix by Steve Langasek,
+    based on something I did earlier. Added
+    debian/patches/300-bdflib-zero-width-glyphs.diff. Closes: #302269
+    (Segmentation fault with certain bdf fonts).
+  * freetype-2.1.7/src/bdf/bdflib.c: BDF font files with glyphs with an
+    encoding value of at least 65536 would overflow the bitmap with 
+    65536 bits which bdflib.c uses to keep track of whether it has seen
+    an encoding already. Changed things so that encodings above the 
+    limit cause an error code to be returned instead of a segfault
+    happening. Ideally, the bitmap should be replaced with a more
+    compact representation, but that is too big a change for something
+    this small. I will, however, only lower the severity of the bug
+    (305413) to normal, instead of marking it fixed. Added
+    debian/patches/300-bdflib-large-encodings.diff.
+
+ -- Lars Wirzenius <[EMAIL PROTECTED]>  Sun, 24 Apr 2005 15:42:00 +0300
+
 freetype (2.1.7-2.3) unstable; urgency=low
 
   * NMU
diff -ruN orig/debian/patches/300-bdflib-large-encodings.diff freetype-2.1.7/debian/patches/300-bdflib-large-encodings.diff
--- orig/debian/patches/300-bdflib-large-encodings.diff	1970-01-01 02:00:00.000000000 +0200
+++ freetype-2.1.7/debian/patches/300-bdflib-large-encodings.diff	2005-04-24 15:59:37.000000000 +0300
@@ -0,0 +1,17 @@
+--- freetype-2.1.7/src/bdf/bdflib.c.old	2005-04-24 11:58:44.000000000 +0000
++++ freetype-2.1.7/src/bdf/bdflib.c	2005-04-24 11:56:37.000000000 +0000
+@@ -1570,6 +1570,14 @@
+         goto Exit;
+       p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 );
+ 
++      /* Check that the encoding is in the range [0, 65535] because       */
++      /* otherwise p->have (a bitmap with static size) overflows.         */
++      if ( p->glyph_enc >= sizeof(p->have) * 8 )
++      {
++	error = BDF_Err_Invalid_File_Format; /* Not the ideal error code */
++	goto Exit;
++      }
++
+       /* Check to see whether this encoding has already been encountered. */
+       /* If it has then change it to unencoded so it gets added if        */
+       /* indicated.                                                       */
diff -ruN orig/debian/patches/300-bdflib-zero-width-glyphs.diff freetype-2.1.7/debian/patches/300-bdflib-zero-width-glyphs.diff
--- orig/debian/patches/300-bdflib-zero-width-glyphs.diff	1970-01-01 02:00:00.000000000 +0200
+++ freetype-2.1.7/debian/patches/300-bdflib-zero-width-glyphs.diff	2005-04-24 15:46:22.000000000 +0300
@@ -0,0 +1,22 @@
+diff -ur freetype-2.1.7.orig/src/bdf/bdflib.c freetype-2.1.7/src/bdf/bdflib.c
+--- freetype-2.1.7.orig/src/bdf/bdflib.c	2003-10-15 15:20:56.000000000 -0700
++++ freetype-2.1.7/src/bdf/bdflib.c	2005-04-24 02:46:31.858144092 -0700
+@@ -1683,7 +1683,7 @@
+       nibbles = glyph->bpr << 1;
+       bp      = glyph->bitmap + p->row * glyph->bpr;
+ 
+-      for ( i = 0, *bp = 0; i < nibbles; i++ )
++      for ( i = 0; i < nibbles; i++ )
+       {
+         c = line[i];
+         *bp = (FT_Byte)( ( *bp << 4 ) + a2i[c] );
+@@ -1693,7 +1693,8 @@
+ 
+       /* Remove possible garbage at the right. */
+       mask_index = ( glyph->bbx.width * p->font->bpp ) & 7;
+-      *bp &= nibble_mask[mask_index];
++      if (glyph->bbx.width)
++        *bp &= nibble_mask[mask_index];
+ 
+       /* If any line has extra columns, indicate they have been removed. */
+       if ( ( line[nibbles] == '0' || a2i[(int)line[nibbles]] != 0 ) &&
diff -ruN orig/debian/rules freetype-2.1.7/debian/rules
--- orig/debian/rules	2005-04-24 15:41:53.000000000 +0300
+++ freetype-2.1.7/debian/rules	2005-04-24 16:01:56.000000000 +0300
@@ -160,6 +160,12 @@
 	# backport of normalization fix (#259875)
 	patch -p0 -i $(patchdir)/090-freetype-2.1.7-normalize-fix.diff
 
+	# don't segfault on zero width BDF glyphs (#302269)
+	patch -p0 -i $(patchdir)/300-bdflib-zero-width-glyphs.diff
+
+	# don't segfault on BDF glyphs with encodings above 65536 (#305413)
+	patch -p0 -i $(patchdir)/300-bdflib-large-encodings.diff
+
 	cd $(freetype_u) && ./configure --prefix=/usr CFLAGS=\"$(CFLAGS)\"
 #	cd $(freetype_u) && ./configure --prefix=/usr
 	$(MAKE) -C $(freetype_u)

Reply via email to