summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--third_party/libtiff/0020-unreasonable-td-bitspersample.patch22
-rw-r--r--third_party/libtiff/README.pdfium1
-rw-r--r--third_party/libtiff/tif_dirread.c11
3 files changed, 34 insertions, 0 deletions
diff --git a/third_party/libtiff/0020-unreasonable-td-bitspersample.patch b/third_party/libtiff/0020-unreasonable-td-bitspersample.patch
new file mode 100644
index 0000000000..1ad5e34e3c
--- /dev/null
+++ b/third_party/libtiff/0020-unreasonable-td-bitspersample.patch
@@ -0,0 +1,22 @@
+diff --git a/third_party/libtiff/tif_dirread.c b/third_party/libtiff/tif_dirread.c
+index 0e3f8ccd4..e0403aef3 100644
+--- a/third_party/libtiff/tif_dirread.c
++++ b/third_party/libtiff/tif_dirread.c
+@@ -3754,6 +3754,17 @@ TIFFReadDirectory(TIFF* tif)
+ fip ? fip->field_name : "unknown tagname");
+ continue;
+ }
++ /* ColorMap or TransferFunction for high bit */
++ /* depths do not make much sense and could be */
++ /* used as a denial of service vector */
++ if (tif->tif_dir.td_bitspersample > 24)
++ {
++ TIFFWarningExt(tif->tif_clientdata,module,
++ "Ignoring %s because BitsPerSample=%d>24",
++ fip ? fip->field_name : "unknown tagname",
++ tif->tif_dir.td_bitspersample);
++ continue;
++ }
+ countpersample=(1L<<tif->tif_dir.td_bitspersample);
+ if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample))
+ {
diff --git a/third_party/libtiff/README.pdfium b/third_party/libtiff/README.pdfium
index 6a78a1968b..219b3a73b0 100644
--- a/third_party/libtiff/README.pdfium
+++ b/third_party/libtiff/README.pdfium
@@ -29,3 +29,4 @@ Local Modifications:
0017-safe_skews_in_gtTileContig.patch: return error if to/from skews overflow from int32.
0018-fix-leak-in-PredictorSetupDecode.patch: call tif->tif_cleanup if the setup fails.
0019-fix-invalid-reads-TIFFFetchNormalTag.patch: upstream security fix in tif_dirread.
+0020-unreasonable-td-bitspersample.patch: upstream patch ignoring large td_bitspersample.
diff --git a/third_party/libtiff/tif_dirread.c b/third_party/libtiff/tif_dirread.c
index 0e3f8ccd48..e0403aef31 100644
--- a/third_party/libtiff/tif_dirread.c
+++ b/third_party/libtiff/tif_dirread.c
@@ -3754,6 +3754,17 @@ TIFFReadDirectory(TIFF* tif)
fip ? fip->field_name : "unknown tagname");
continue;
}
+ /* ColorMap or TransferFunction for high bit */
+ /* depths do not make much sense and could be */
+ /* used as a denial of service vector */
+ if (tif->tif_dir.td_bitspersample > 24)
+ {
+ TIFFWarningExt(tif->tif_clientdata,module,
+ "Ignoring %s because BitsPerSample=%d>24",
+ fip ? fip->field_name : "unknown tagname",
+ tif->tif_dir.td_bitspersample);
+ continue;
+ }
countpersample=(1L<<tif->tif_dir.td_bitspersample);
if ((dp->tdir_tag==TIFFTAG_TRANSFERFUNCTION)&&(dp->tdir_count==(uint64)countpersample))
{