Commit f841c5998 for imagemagick.org
commit f841c599893d42e59d3ef6783b219152a45b91cd
Author: Dirk Lemstra <dirk@lemstra.org>
Date: Tue Oct 6 18:44:44 2026 +0200
Try reading the file as a DNG after the TIFF is read so we can still return the tiff when DNG reading fails (#9001).
diff --git a/coders/tiff.c b/coders/tiff.c
index 4c421fdad..417bd1697 100644
--- a/coders/tiff.c
+++ b/coders/tiff.c
@@ -1139,8 +1139,8 @@ static void TIFFReadPhotoshopLayers(const ImageInfo *image_info,Image *image,
}
#endif
-static Image *ReadTIFFImage(const ImageInfo *image_info,
- ExceptionInfo *exception)
+static Image *ReadTIFFImageInternal(const ImageInfo *image_info,
+ MagickBooleanType *is_dng,ExceptionInfo *exception)
{
#define ThrowTIFFException(severity,message) \
{ \
@@ -1259,35 +1259,8 @@ static Image *ReadTIFFImage(const ImageInfo *image_info,
image=DestroyImageList(image);
return((Image *) NULL);
}
- if ((image_info->affirm == MagickFalse) &&
- (TIFFGetField(tiff,TIFFTAG_DNGVERSION,&dng_version) == 1))
- {
- Image
- *dng_image = (Image *) NULL;
-
- /*
- Redirect to DNG image reader.
- */
- ImageInfo *read_info = CloneImageInfo(image_info);
- (void) CopyMagickString(read_info->magick,"DNG",MagickPathExtent);
- TIFFClose(tiff);
- if (*read_info->filename != '\0')
- dng_image=ReadImageWithoutPostProcessing(read_info,exception);
- else
- {
- status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
- if (status != MagickFalse)
- {
- status=ImageToFile(image,read_info->filename,exception);
- if (status != MagickFalse)
- dng_image=ReadImageWithoutPostProcessing(read_info,exception);
- (void) RelinquishUniqueFileResource(read_info->filename);
- }
- }
- read_info=DestroyImageInfo(read_info);
- image=DestroyImageList(image);
- return(dng_image);
- }
+ if (TIFFGetField(tiff,TIFFTAG_DNGVERSION,&dng_version) == 1)
+ *is_dng=MagickTrue;
if (image_info->number_scenes != 0)
{
/*
@@ -2295,6 +2268,66 @@ static Image *ReadTIFFImage(const ImageInfo *image_info,
return(DestroyImageList(image));
return(GetFirstImageInList(image));
}
+
+static Image *ReadTIFFImage(const ImageInfo *image_info,
+ ExceptionInfo *exception)
+{
+ ExceptionInfo
+ *dng_exception;
+
+ Image
+ *dng_image = (Image *) NULL,
+ *image;
+
+ ImageInfo
+ *read_info;
+
+ MagickBooleanType
+ is_dng = MagickFalse,
+ status;
+
+ /*
+ Read the image as TIFF and remember whether it has a DNGVersion tag.
+ */
+ image=ReadTIFFImageInternal(image_info,&is_dng,exception);
+ if ((image == (Image *) NULL) || (is_dng == MagickFalse) ||
+ (image_info->affirm != MagickFalse))
+ return(image);
+ /*
+ Try the DNG image reader and only use its result when it succeeds.
+ */
+ dng_exception=AcquireExceptionInfo();
+ read_info=CloneImageInfo(image_info);
+ (void) CopyMagickString(read_info->magick,"DNG",MagickPathExtent);
+ if (*read_info->filename != '\0')
+ dng_image=ReadImageWithoutPostProcessing(read_info,dng_exception);
+ else
+ {
+ Image
+ *blob_image;
+
+ blob_image=AcquireImage(image_info,dng_exception);
+ status=OpenBlob(image_info,blob_image,ReadBinaryBlobMode,dng_exception);
+ if (status != MagickFalse)
+ {
+ status=ImageToFile(blob_image,read_info->filename,dng_exception);
+ (void) CloseBlob(blob_image);
+ if (status != MagickFalse)
+ dng_image=ReadImageWithoutPostProcessing(read_info,dng_exception);
+ (void) RelinquishUniqueFileResource(read_info->filename);
+ }
+ blob_image=DestroyImage(blob_image);
+ }
+ read_info=DestroyImageInfo(read_info);
+ if (dng_image != (Image *) NULL)
+ {
+ image=DestroyImageList(image);
+ InheritException(exception,dng_exception);
+ image=dng_image;
+ }
+ dng_exception=DestroyExceptionInfo(dng_exception);
+ return(image);
+}
#endif
/*