|
|
- From f3f0cad770593eaef0766e5be896a6a034fc6313 Mon Sep 17 00:00:00 2001
- From: erouault <erouault>
- Date: Sat, 26 Dec 2015 17:32:03 +0000
- Subject: [PATCH] * libtiff/tif_getimage.c: fix out-of-bound reads in
- TIFFRGBAImage interface in case of unsupported values of
- SamplesPerPixel/ExtraSamples for LogLUV / CIELab. Add explicit call to
- TIFFRGBAImageOK() in TIFFRGBAImageBegin(). Fix CVE-2015-8665 reported by
- limingxing and CVE-2015-8683 reported by zzf of Alibaba.
-
- ---
- ChangeLog | 8 ++++++++
- libtiff/tif_getimage.c | 37 +++++++++++++++++++++++--------------
- 2 files changed, 31 insertions(+), 14 deletions(-)
-
- diff --git a/ChangeLog b/ChangeLog
- index a7d283a..4beb30b 100644
- --- a/ChangeLog
- +++ b/ChangeLog
- @@ -1,3 +1,11 @@
- +2015-12-26 Even Rouault <even.rouault at spatialys.com>
- +
- + * libtiff/tif_getimage.c: fix out-of-bound reads in TIFFRGBAImage
- + interface in case of unsupported values of SamplesPerPixel/ExtraSamples
- + for LogLUV / CIELab. Add explicit call to TIFFRGBAImageOK() in
- + TIFFRGBAImageBegin(). Fix CVE-2015-8665 reported by limingxing and
- + CVE-2015-8683 reported by zzf of Alibaba.
- +
- 2015-09-12 Bob Friesenhahn <bfriesen@simple.dallas.tx.us>
-
- * libtiff 4.0.6 released.
- diff --git a/libtiff/tif_getimage.c b/libtiff/tif_getimage.c
- index fd0a4f9..fae1e31 100644
- --- a/libtiff/tif_getimage.c
- +++ b/libtiff/tif_getimage.c
- @@ -1,4 +1,4 @@
- -/* $Id: tif_getimage.c,v 1.90 2015-06-17 01:34:08 bfriesen Exp $ */
- +/* $Id: tif_getimage.c,v 1.94 2015-12-26 17:32:03 erouault Exp $ */
-
- /*
- * Copyright (c) 1991-1997 Sam Leffler
- @@ -182,20 +182,22 @@ TIFFRGBAImageOK(TIFF* tif, char emsg[1024])
- "Planarconfiguration", td->td_planarconfig);
- return (0);
- }
- - if( td->td_samplesperpixel != 3 )
- + if( td->td_samplesperpixel != 3 || colorchannels != 3 )
- {
- sprintf(emsg,
- - "Sorry, can not handle image with %s=%d",
- - "Samples/pixel", td->td_samplesperpixel);
- + "Sorry, can not handle image with %s=%d, %s=%d",
- + "Samples/pixel", td->td_samplesperpixel,
- + "colorchannels", colorchannels);
- return 0;
- }
- break;
- case PHOTOMETRIC_CIELAB:
- - if( td->td_samplesperpixel != 3 || td->td_bitspersample != 8 )
- + if( td->td_samplesperpixel != 3 || colorchannels != 3 || td->td_bitspersample != 8 )
- {
- sprintf(emsg,
- - "Sorry, can not handle image with %s=%d and %s=%d",
- + "Sorry, can not handle image with %s=%d, %s=%d and %s=%d",
- "Samples/pixel", td->td_samplesperpixel,
- + "colorchannels", colorchannels,
- "Bits/sample", td->td_bitspersample);
- return 0;
- }
- @@ -255,6 +257,9 @@ TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stop, char emsg[1024])
- int colorchannels;
- uint16 *red_orig, *green_orig, *blue_orig;
- int n_color;
- +
- + if( !TIFFRGBAImageOK(tif, emsg) )
- + return 0;
-
- /* Initialize to normal values */
- img->row_offset = 0;
- @@ -2508,29 +2513,33 @@ PickContigCase(TIFFRGBAImage* img)
- case PHOTOMETRIC_RGB:
- switch (img->bitspersample) {
- case 8:
- - if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
- + if (img->alpha == EXTRASAMPLE_ASSOCALPHA &&
- + img->samplesperpixel >= 4)
- img->put.contig = putRGBAAcontig8bittile;
- - else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
- + else if (img->alpha == EXTRASAMPLE_UNASSALPHA &&
- + img->samplesperpixel >= 4)
- {
- if (BuildMapUaToAa(img))
- img->put.contig = putRGBUAcontig8bittile;
- }
- - else
- + else if( img->samplesperpixel >= 3 )
- img->put.contig = putRGBcontig8bittile;
- break;
- case 16:
- - if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
- + if (img->alpha == EXTRASAMPLE_ASSOCALPHA &&
- + img->samplesperpixel >=4 )
- {
- if (BuildMapBitdepth16To8(img))
- img->put.contig = putRGBAAcontig16bittile;
- }
- - else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
- + else if (img->alpha == EXTRASAMPLE_UNASSALPHA &&
- + img->samplesperpixel >=4 )
- {
- if (BuildMapBitdepth16To8(img) &&
- BuildMapUaToAa(img))
- img->put.contig = putRGBUAcontig16bittile;
- }
- - else
- + else if( img->samplesperpixel >=3 )
- {
- if (BuildMapBitdepth16To8(img))
- img->put.contig = putRGBcontig16bittile;
- @@ -2539,7 +2548,7 @@ PickContigCase(TIFFRGBAImage* img)
- }
- break;
- case PHOTOMETRIC_SEPARATED:
- - if (buildMap(img)) {
- + if (img->samplesperpixel >=4 && buildMap(img)) {
- if (img->bitspersample == 8) {
- if (!img->Map)
- img->put.contig = putRGBcontig8bitCMYKtile;
- @@ -2635,7 +2644,7 @@ PickContigCase(TIFFRGBAImage* img)
- }
- break;
- case PHOTOMETRIC_CIELAB:
- - if (buildMap(img)) {
- + if (img->samplesperpixel == 3 && buildMap(img)) {
- if (img->bitspersample == 8)
- img->put.contig = initCIELabConversion(img);
- break;
|