Blame SOURCES/libtiff-ycbcr-clamp.patch

e4d7d2
Using an array to clamp translated YCbCr values is insecure, because if the
e4d7d2
TIFF file contains bogus ReferenceBlackWhite parameters, the computed RGB
e4d7d2
values could be very far out of range (much further than the current array
e4d7d2
size, anyway), possibly resulting in SIGSEGV.  Just drop the whole idea in
e4d7d2
favor of using a comparison-based macro to clamp.  See RH bug #583081.
e4d7d2
e4d7d2
Filed upstream at http://bugzilla.maptools.org/show_bug.cgi?id=2208
e4d7d2
e4d7d2
e4d7d2
diff -Naur tiff-3.9.2.orig/libtiff/tif_color.c tiff-3.9.2/libtiff/tif_color.c
e4d7d2
--- tiff-3.9.2.orig/libtiff/tif_color.c	2006-02-09 10:42:20.000000000 -0500
e4d7d2
+++ tiff-3.9.2/libtiff/tif_color.c	2010-06-10 15:53:24.000000000 -0400
e4d7d2
@@ -183,13 +183,18 @@
e4d7d2
 TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr,
e4d7d2
 	       uint32 *r, uint32 *g, uint32 *b)
e4d7d2
 {
e4d7d2
+	int32 i;
e4d7d2
+
e4d7d2
 	/* XXX: Only 8-bit YCbCr input supported for now */
e4d7d2
 	Y = HICLAMP(Y, 255), Cb = CLAMP(Cb, 0, 255), Cr = CLAMP(Cr, 0, 255);
e4d7d2
 
e4d7d2
-	*r = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr]];
e4d7d2
-	*g = ycbcr->clamptab[ycbcr->Y_tab[Y]
e4d7d2
-	    + (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT)];
e4d7d2
-	*b = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb]];
e4d7d2
+	i = ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr];
e4d7d2
+	*r = CLAMP(i, 0, 255);
e4d7d2
+	i = ycbcr->Y_tab[Y]
e4d7d2
+	    + (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT);
e4d7d2
+	*g = CLAMP(i, 0, 255);
e4d7d2
+	i = ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb];
e4d7d2
+	*b = CLAMP(i, 0, 255);
e4d7d2
 }
e4d7d2
 
e4d7d2
 /*