Home | History | Annotate | Download | only in libtiff
      1 From f94a29a822f5528d2334592760fbb7938f15eb55 Mon Sep 17 00:00:00 2001
      2 From: erouault <erouault>
      3 Date: Sat, 26 Dec 2015 17:32:03 +0000
      4 Subject: [PATCH] * libtiff/tif_getimage.c: fix out-of-bound reads in
      5  TIFFRGBAImage interface in case of unsupported values of
      6  SamplesPerPixel/ExtraSamples for LogLUV / CIELab. Add explicit call to
      7  TIFFRGBAImageOK() in TIFFRGBAImageBegin(). Fix CVE-2015-8665 reported by
      8  limingxing and CVE-2015-8683 reported by zzf of Alibaba.
      9 
     10 ---
     11  ChangeLog              |  8 ++++++++
     12  libtiff/tif_getimage.c | 35 ++++++++++++++++++++++-------------
     13  2 files changed, 30 insertions(+), 13 deletions(-)
     14 
     15 Index: tiff-4.0.3/libtiff/tif_getimage.c
     16 ===================================================================
     17 --- tiff-4.0.3.orig/libtiff/tif_getimage.c	2016-03-23 10:13:42.728371661 -0400
     18 +++ tiff-4.0.3/libtiff/tif_getimage.c	2016-03-23 10:13:42.724371614 -0400
     19 @@ -182,20 +182,22 @@
     20  				    "Planarconfiguration", td->td_planarconfig);
     21  				return (0);
     22  			}
     23 -			if( td->td_samplesperpixel != 3 )
     24 +			if( td->td_samplesperpixel != 3 || colorchannels != 3 )
     25              {
     26                  sprintf(emsg,
     27 -                        "Sorry, can not handle image with %s=%d",
     28 -                        "Samples/pixel", td->td_samplesperpixel);
     29 +                        "Sorry, can not handle image with %s=%d, %s=%d",
     30 +                        "Samples/pixel", td->td_samplesperpixel,
     31 +                        "colorchannels", colorchannels);
     32                  return 0;
     33              }
     34  			break;
     35  		case PHOTOMETRIC_CIELAB:
     36 -            if( td->td_samplesperpixel != 3 || td->td_bitspersample != 8 )
     37 +            if( td->td_samplesperpixel != 3 || colorchannels != 3 || td->td_bitspersample != 8 )
     38              {
     39                  sprintf(emsg,
     40 -                        "Sorry, can not handle image with %s=%d and %s=%d",
     41 +                        "Sorry, can not handle image with %s=%d, %s=%d and %s=%d",
     42                          "Samples/pixel", td->td_samplesperpixel,
     43 +                        "colorchannels", colorchannels,
     44                          "Bits/sample", td->td_bitspersample);
     45                  return 0;
     46              }
     47 @@ -255,6 +257,9 @@
     48  	int colorchannels;
     49  	uint16 *red_orig, *green_orig, *blue_orig;
     50  	int n_color;
     51 +	
     52 +	if( !TIFFRGBAImageOK(tif, emsg) )
     53 +		return 0;
     54  
     55  	/* Initialize to normal values */
     56  	img->row_offset = 0;
     57 @@ -2470,29 +2475,33 @@
     58  		case PHOTOMETRIC_RGB:
     59  			switch (img->bitspersample) {
     60  				case 8:
     61 -					if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
     62 +					if (img->alpha == EXTRASAMPLE_ASSOCALPHA &&
     63 +						img->samplesperpixel >= 4)
     64  						img->put.contig = putRGBAAcontig8bittile;
     65 -					else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
     66 +					else if (img->alpha == EXTRASAMPLE_UNASSALPHA &&
     67 +							 img->samplesperpixel >= 4)
     68  					{
     69  						if (BuildMapUaToAa(img))
     70  							img->put.contig = putRGBUAcontig8bittile;
     71  					}
     72 -					else
     73 +					else if( img->samplesperpixel >= 3 )
     74  						img->put.contig = putRGBcontig8bittile;
     75  					break;
     76  				case 16:
     77 -					if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
     78 +					if (img->alpha == EXTRASAMPLE_ASSOCALPHA &&
     79 +						img->samplesperpixel >=4 )
     80  					{
     81  						if (BuildMapBitdepth16To8(img))
     82  							img->put.contig = putRGBAAcontig16bittile;
     83  					}
     84 -					else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
     85 +					else if (img->alpha == EXTRASAMPLE_UNASSALPHA &&
     86 +							 img->samplesperpixel >=4 )
     87  					{
     88  						if (BuildMapBitdepth16To8(img) &&
     89  						    BuildMapUaToAa(img))
     90  							img->put.contig = putRGBUAcontig16bittile;
     91  					}
     92 -					else
     93 +					else if( img->samplesperpixel >=3 )
     94  					{
     95  						if (BuildMapBitdepth16To8(img))
     96  							img->put.contig = putRGBcontig16bittile;
     97 @@ -2501,7 +2510,7 @@
     98  			}
     99  			break;
    100  		case PHOTOMETRIC_SEPARATED:
    101 -			if (buildMap(img)) {
    102 +			if (img->samplesperpixel >=4 && buildMap(img)) {
    103  				if (img->bitspersample == 8) {
    104  					if (!img->Map)
    105  						img->put.contig = putRGBcontig8bitCMYKtile;
    106 @@ -2597,7 +2606,7 @@
    107  			}
    108  			break;
    109  		case PHOTOMETRIC_CIELAB:
    110 -			if (buildMap(img)) {
    111 +			if (img->samplesperpixel == 3 && buildMap(img)) {
    112  				if (img->bitspersample == 8)
    113  					img->put.contig = initCIELabConversion(img);
    114  				break;
    115