From d39c4121a9daf2ccaaa30454b5ee28eae3a867a9 Mon Sep 17 00:00:00 2001 From: CleanCodeDeveloper <16760760+CleanCodeDeveloper@users.noreply.github.com> Date: Wed, 29 Dec 2021 18:01:31 +0100 Subject: [PATCH] fix regression #14715 by adding an additional check for the newly build metadata object (#15198) --- .../ui/Extensions/BitmapMetadataExtension.cs | 25 +++++++++++++++++++ .../imageresizer/ui/Models/ResizeOperation.cs | 10 +++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/modules/imageresizer/ui/Extensions/BitmapMetadataExtension.cs b/src/modules/imageresizer/ui/Extensions/BitmapMetadataExtension.cs index 6bf4b4ace9..97fd4ebdba 100644 --- a/src/modules/imageresizer/ui/Extensions/BitmapMetadataExtension.cs +++ b/src/modules/imageresizer/ui/Extensions/BitmapMetadataExtension.cs @@ -187,6 +187,31 @@ namespace ImageResizer.Extensions } } + /// + /// Detect whether the metadata object is valid and can be copied successfully + /// + /// + /// ImageMetadata.Clone() causes an exception if there is something wrong with the metadata object. + /// Operation is rather expensive. + /// + /// Metadata object to be checked + /// true if valid, false if invalid + public static bool IsMetadataObjectValid(this BitmapMetadata metadata) + { + try + { + _ = metadata.Clone(); + + return true; + } +#pragma warning disable CA1031 // Do not catch general exception types + catch (Exception) +#pragma warning restore CA1031 // Do not catch general exception types + { + return false; + } + } + /// /// Prints all metadata to debug console /// diff --git a/src/modules/imageresizer/ui/Models/ResizeOperation.cs b/src/modules/imageresizer/ui/Models/ResizeOperation.cs index daf5b3137b..0d087193bf 100644 --- a/src/modules/imageresizer/ui/Models/ResizeOperation.cs +++ b/src/modules/imageresizer/ui/Models/ResizeOperation.cs @@ -104,7 +104,15 @@ namespace ImageResizer.Models } } - metadata = newMetadata; + if (newMetadata.IsMetadataObjectValid()) + { + metadata = newMetadata; + } + else + { + // Seems like we build an invalid metadata object. ImageResizer will fail when trying to write the image to disk. We discard all metadata to be able to save the image. + metadata = null; + } } catch (ArgumentException ex) {