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