From dfd19f3ad43827f69e74e8bd0c786e1c4152f1fe Mon Sep 17 00:00:00 2001 From: evazion Date: Mon, 31 Oct 2022 02:14:44 -0500 Subject: [PATCH] media file: fix exception when getting frame count of corrupted gif. Fix a `gifload: no frames in GIF` error from libvips when trying to read the frame count for https://danbooru.donmai.us/media_assets/1141668. --- app/logical/media_file/image.rb | 9 ++++++++- test/files/gif/corrupt-static.gif | Bin 0 -> 40524 bytes test/unit/media_file_test.rb | 12 ++++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 test/files/gif/corrupt-static.gif diff --git a/app/logical/media_file/image.rb b/app/logical/media_file/image.rb index 8da9c066e..175d44deb 100644 --- a/app/logical/media_file/image.rb +++ b/app/logical/media_file/image.rb @@ -40,7 +40,7 @@ class MediaFile::Image < MediaFile def frame_count case file_ext when :gif, :webp - image.get("n-pages") if image.get_fields.include?("n-pages") + n_pages when :png metadata.fetch("PNG:AnimationFrames", 1) when :avif @@ -50,6 +50,13 @@ class MediaFile::Image < MediaFile end end + # @return [Integer, nil] The frame count for gif and webp images, or possibly nil if the file doesn't have a frame count or is corrupt. + def n_pages + image.get("n-pages") + rescue Vips::Error + nil + end + def frame_rate return nil if !is_animated? || frame_count.nil? || duration.nil? || duration == 0 frame_count / duration diff --git a/test/files/gif/corrupt-static.gif b/test/files/gif/corrupt-static.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b183cbbfcba27b5441f55e872f58da10f088a0a GIT binary patch literal 40524 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

1_# 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 Kcukluo(lj$Rnp=B literal 0 HcmV?d00001 diff --git a/test/unit/media_file_test.rb b/test/unit/media_file_test.rb index 6bf8efa56..3e55381f4 100644 --- a/test/unit/media_file_test.rb +++ b/test/unit/media_file_test.rb @@ -471,6 +471,18 @@ class MediaFileTest < ActiveSupport::TestCase assert_equal("89a", @metadata["GIF:GIFVersion"]) assert_equal(6, @metadata.count) end + + should "not raise an exception when reading the frame count" do + @file = MediaFile.open("test/files/gif/corrupt-static.gif") + @metadata = @file.metadata + + assert_equal(true, @file.is_corrupt?) + assert_equal(nil, @file.frame_count) + assert_equal("File format error", @metadata["ExifTool:Error"]) + assert_equal("89a", @metadata["GIF:GIFVersion"]) + assert_equal(6, @metadata.count) + assert_nothing_raised { @file.attributes } + end end context "a corrupt PNG" do